培训会议主讲记录20220812

近一两年来在公司主讲代码培训差不多进行了二三十次,但是感觉效果都不是很好。很难调动起气氛,事后也看不到同事的代码水平有什么提升。深刻的体会到了大学时老师在台上声嘶力竭得讲,看着台下一片混混欲睡的学生是什么感觉

方法改进

为了提升培训的效果,本次培训采用了新的方式,以工作中的一个实际问题为例,逐步的讲解如何进行处理。本次的培训分为两部分,一是解决问题的流程以及实战演练,二是进一步深化,讲解设计代码的思路

培训内容

解决问题的流程

  • 首先是找到问题所在
  • 如何找到对应功能的代码
  • 如何分析运作的机理
  • 修改时应当注意的问题/影响范围
  • 从表面的原因分析出深层的原因

并从这些实际的例子中,抛砖引玉插入代码设计、编写中的思路技巧经验和注意事项

然后是深化培训的内容,进一步讲解如何设计优化一项功能

  • 例举所有的需求
  • 提出基本的实现流程
  • 从多个角度去分析、归类需求
  • 按照分析和归类去整理出总的要求
  • 设计数据结构
  • 根据具体的实现去优化迭代设计

效果和心得

虽然培训会议持续了足足三个小时,但是总体的效果看起来比以前要好很多。通过现场演练,和加强提问的互动环节,听起来总算没那么干巴巴了的。而且根据现场反馈,这样一点点的讲,能够更好的掌握项目原有代码的思路,之前只是对着设计说明书一顿输出,听着云里雾里的,效果不好。

可能一两次培训难以立刻提升与会人员的代码设计能力和分析水平,毕竟演练中的实际问题作为主讲的我轻描淡写地就解决了,其实背后需要大量的积累。但是至少这个功能,都大概掌握了。

而且在过程中,像附文那样现场创建一个文档将内容边讲解边记录下来,起到了一个像板书一样的效果,也可以帮助现场理解和集中注意力。同时有一个现场的记录方便回忆和巩固。

总结上,这次的方式可以延续下来。

改进

  • 要准备一个更好的电脑。现场演练需要实时地编译代码,这次使用的 mbp 的低压 i5 实在是慢,过慢的编译速度浪费了不少时间和频繁打断了讲解。

  • 换上实际的开发环境。这次使用的 vs code,无法满足大型工程的语法智能分析,没有很好跳转代码,浪费了不少时间。

附文

附当场的主讲记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*******************************************************************************
2022年8月12号星期五15点—18点
与会:全体软件平台组10人
主题:从节点捕捉功能为实例讲述问题解决和代码设计
*******************************************************************************/
节点捕捉到自身
节点捕捉的功能单一,比较简单

+ 找到代码在哪里
+ 直接问设计的人,远古代码,领导很忙
+ 设计文档,文档不全,很难看懂
+ 自己找
+ 分析功能的入口,mouseMove
+ 断点:循环事件每次都触发,无法筛选

+ 分析运作的机理
+ 合理的运用断点
+ 相关的文档
+ 代码有足够注释
+ 代码合理的名字和结构是更好的注释

qt mouseMoveEvent-》setMouseAutoCapture
-〉View::AutoCapture->View::CaptureQuery
-> 1.Scene::CaptureQuery 2.Mode::CaptureQuery
在空间索引里面查找,筛选的条件不够
-> Item::CaptureQuery 线索断了

根据 Item::CaptureQuery 的结果来绘制和设置数据
设置到 VMouseEvent

+ 开始修改
+ Scene::CaptureQuery简单的修改了(增加 IsSelected()的判断)
带来影响几乎是全局的

+ 有别的地方和这里有同样的问题(面向对象,基类子类继承)
+ 改动会不会影响到别的不需要的地方,带来新的问题

+ 应该在 ViewMode 里面改

Mode,Scene,管辖的范围重合,

需求:
+ 针对不同的情况,可以进行特化,且互不影响
问题
+ 处理范围重合(返回的情况过于单一,只用一个bool变量进行标示,只能标记有没有查询到
+ 已经处理,但是没找到需要捕捉到点


CaptureData 有效的利用起来-》修正流程兼容更多的情况。captureItem也要根据对应的属性重新绘制

+ 节点、圆心、中点的捕捉
+ 栅格的捕捉
+ 交点、垂点、切点、最近点的捕捉

+ 程序:
-》 输入:鼠标位置,捕捉范围

(最简单)—》捕捉的范围做空间查询-》对应图形-》(如果是路径对象-》对应线段

《- 输出:捕捉的点,捕捉的类型(扩展图像输出)

分类需求(可以从很多角度去区分):
输入需求的角度:
只需要鼠标点和捕捉范围的(隐藏的意义:剩下所需的属性只需要有对象本身提供)
节点、圆心、中点、栅格、已有交点的捕捉,只需要 Item::CaptureQuery 自己实现
需要只是额外的交互对象的:
交点、垂点、切点、最近点的捕捉(可以指示/储存额外对象)(any,type enum)

交互的需求:
需要提前指示的:圆心(不会一直显示的属性点)-》需要修改流程(多步合作)

实现难度:
交点(同一个图形之间的交点,不同图形之间的交点(不同的子类的))(只做单一对象的交点
运算速度,设计结构

数据结构
CaptureData

算法,需求,功能
——》分析好需求-》设计数据结构-》实现调整
分类。

课后思考:
1. 怎么插入栅格的捕捉
2. 找出这里栅格的实现过程,插入自动的捕捉