工作中遇到的问题

1.在用一套类的命名规则命名所有向导页之后,需求发生变化,导致新增类的命名规则和已有类不一致,冲突严重。
思路:命名时考虑将来的变化,比如说假设需求变了,新的类名是否能适应现有规则,以动态的眼光看问题,不要以为什么东西都是不变的。


2.程序写着写着又发现有更好的解决方案,导致改动面很大。
思路:解决一个问题时考虑所有的解决方案,不要抓住一个能够解决问题的方案就写。写好一个之后严格测试,看是否还有优化的空间,再应用到其他地方。


3.程序间耦合性太强,比如,某个向导页的一个成员变量产生变化,可能会导致相关的若干个地方发生改动。
思路:真的不要提供太多的公有成员,如果仅仅时提供功能函数,一定是const函数,对函数的调用不会影响对象的状态。如果是向导页呢?


4.界面文字上的改变,引起原来的资源ID,所挂变量名发生不适应。
思路:各种ID,变量都不要确定。等最后亚的时候再定。找不变的工作,完成并封装。


5.程序逻辑性不强,经常出现问题,等发现问题再改正,可否程序一次性就写对?
思路:考虑各种情况


6.对于一些控件,如文本框,每次都是同样的验证,那么代码将变得冗余重复。
思路:提取出来形成自己的类,就算用一次也值得,谁知道会用几次呢?是不是


7.如果你想完成一个模块,但是你有暂时完成不了,该怎么办?




在进行文件核对之前,必须将工程所有文件进行备份,以防不测。




以前使用SetTimer出现的问题:
如果创建SetTimer的线程没有DispatchMessage函数(或者说没有消息队列和消息循环),则SetTimer的OnTimer或者TimerProc不能被执行,因为消息根本就没法保存和传递及调用处理函数。


2006-07-25
每天都遇到哪些问题,成功了还是失败了,成功的原因,失败的原因,该如何改进?弄一个笔记本,没晚睡觉的时候记录下来。


怎么才能让自己经常回顾以前记下来的东西,以前我记的东西基本上都没有看过,就被淡忘了


为什么搭一个老的环境花了那么多时间?(OMC+SCH+LOG)+PMCTester


发GB OMC给左力华的时候别人都问了是不是最新的,但还是发了一个老的给他,为什么?我也比较了=>原因:抱着一种盲目相信是正确的观点,根本就没有比较完全,也没有回忆自己的是不是在那个基础上改的。


对于自己的不确认(怀疑自己不是在最新版上改的)导致自己在做其他事情(添加NGN-GB插件id)上也没有自信。事情干一件,确认一件,没确认之前,别干其他的。


为什么自己老是做错事?
老是记不住东西
总是怀疑自己
降低了工作效率,比如总是在文档间不断切换。
=>理清问题,强迫记忆,相信自己,放松!


2006-07-26
为什么加日志的时候头脑好像是木的,停止了思考,犯了那么多小错误,需要回头检查,效率太低了,争取一次正确=>保持头脑清醒,线想好再做。


光盘上,网上的例子是收集不完,看不完的。但是一些常用的库可由哪些功能还是应该知道的,比如MFC,STL等=>总结其功能,确立关键字,方便此后搜索!


2006-8-01
为什么会出现那么多小问题,就是当初没有一点点的完成,有问题马上解决,听王林的口气:
问强澄英
问左力华
问马涛
=>一句话,问问问


流量实时统计:要完成一个东西,首先要对整体有所把握,然后再分解来做,否则,抓住半截就跑,到头来全部都要返工。比如G9日志翻页,当初拣便宜做好了,到头来还得重做,重做时既要兼顾以前的代码(看懂以前的)又要兼顾以后的代码(调试新写的代码),同时还要考虑会不会对以前的代码产生副作用,填问题单。其工作量远远超过了以前就按现在 的实现方法的工作量,并且返工是一件烦人的事情,宁愿重写也不愿改写。
=>不要投机取巧拣便宜,争取一步到位,就算多花点时间也是值得的。
前面修改了一下GB的翻页,如果要实现排序的话,修改又白修改了,这就是以前工作没到位,写程序时一定要考虑扩展,只要以后有可能需要添加的东西,都要考虑到,不要只顾完成眼前的问题。


在写程序之前,了解又哪些东西可用时非常重要的,比如公共头文件。(也就是说在写程序之前,你需要首先确定你已经拥有了哪些资源,不要光顾实现,有现成的就最好用现成的)


我再他妈的往程序中写死东西我就不是人,从明天做起。(定义一个公共头文件+公共cpp文件,用来存放经常用到的宏,常量,函数)。
以不变应万变->可维护行->一致性(同样的东西一定要相同,比如控件的大小,间距,位置等)


2005年12月 统一客户资料平台
经过一个周就被淘汰了,这真是我的耻辱,不过我已经预感到了。教训:
为了再工作中不被淘汰,必须(会看-> 会问-> 会记-> 会说)


在十所马上就快工作一年了,回头翻翻以前在工作中所做的笔记和理解,问题,想想当初怎么就那么傻呢,整天还提心吊胆的。自己不亲手接触实际的工作,不管你怎么看,你始终不能清楚地理解,所以没必要担心。实际上,当没有实际工作的时候,我们最好多配置一下程序环境,多动手操作操作,对实际的程序来点直观的理解,比整天提心吊胆地钻入程序代码中更有用!等有实际的东西做时,一切自然会变得清晰!不过说回来,当初理解的那些傻问题,还是有点用,多调试程序,不会太难的,所以不用担心!!!!车到山前必有路,但是不要盲目自信和等待!!!谨记!能够多理解点还是多理解点,哪怕和花的时间不成比例!


2007.11.30
为什么告警翻页花了那么多时间,几次都没搞对?
答:
事情一次做对确实比以后改起来节约时间,哪怕当时多花点时间,比如告警的翻页,改了多少次都没对,后面找对方法后,就再也没出什么问题了。
如果要赶进度,那么就把困难直接给领导说,只要能拍胸膛说我一次能做好,肯定领导会考虑的。
最重要的困难是理解不够,所以想一次做好有点困难,因为理解是逐步加深的。


在不理解需求之前不要动手写代码,宁愿耍也不要动,否则后面会花更多的时间返工。


别做没把握的东西,最多只做基本功能,分清什么是最重要的。


需求可以通过电话,看别人已经做出来的的东西参考,虽不能完全就获得了真正的需求,至少能把握住最基本的了。


写代码还是要有设计,对设计没把握的时候也千万别写代码。






2007.11.30
写程序要尽量多的加断言和VERIFY,比如今天晚上回归问题时,因为有断言,我一下子就发现了有问题。
在关键地方一定要打日志,不是为了什么,至少可以证明程序跑到什么地方了,我正在做什么操作,出现问题时也可以及时推脱责任。
哪些地方才是关键地方呢?
答:
线程启动和结束,至少把线程id给打出来,这样通过进程查看器就能观察到每个线程的运行情况。






2009.2.26
从昨天开始到今天,主要任务是将SIP独立呼叫器改成一个插件,加入到UCC中。在这个过程中,遇到不少困难:


1. 由于对COM不熟,不清楚怎样才能通过向导生成和其他如TCC插件相同的代码?所以我打算从Startup这个代码比较少的修改成SIP插件,结果老是编译不能通过?


2. 和鲁建华解决编译不能通过问题,就其根源还是对COM不熟?


3. COM和DLL比起来究竟有哪些优势?什么时候用COM,什么时候用DLL?
答:


4. 为什么改变一次工程类型引起那么多错误?理想状态是直接代码放过去就可以了?怎么才能做到这样?


5. 如何透彻理解COM,做到可以理解每一行代码,可以自己随意修改?


6. 为什么我想从ATCA或TCE中迁移代码OutlookBar过来那么难,按理我迁移的都是大家共有的功能,应该很容易才对,是不是代码模块没划分好呢?即重用性不好?看来在写代码时,考虑重用性也是很大一方面?
答:


7. 为什么每个插件会出现那么多重复代码?比如实现的MEA接口函数


8. 为什么每个插件相同功能的实现却不一样?比如OutlookBar的创建


9. 搞那么复杂的宏,模板,那么多个类去实现什么自动注册,什么工厂之类的值得吗?用全局或者其他简单的方式不能实现吗?这复杂的代码多难看呀?


10. 为什么还是没有搞清楚NTE的逻辑关系?不太清楚哪些东西到哪些地方了?


11. 为什么我不能解决出现的异常呢?


12. 如何理清多线程的逻辑,即用一种直观的方式体现出来,包括交互过程,共享的资源,是否会死锁?
答:一定要在代码中将线程何时创建、何时结束、共享的资源有哪些列出来。这样的好处是看代码更容易,更容易理清逻辑。
有时对象不知道什么时候别人才不调用它的函数,这时它才可以删除自己,出现这样的情况可能是不应该的,因为程序不应该出现这种无法控制的逻辑,此时是不是可以考虑一下对象的合并,一定要使设计是可控的。


13. 为什么目前对取名和划分函数还是有困难?
答:需要一个长期的积累过程。


14. 为什么对工程目录的组织还是不那么确定?
答:主要还是对整个需求的把握问题,还是就是应该多看看别人的好代码是如何组织目录的。


15. 感觉还是不会设计界面?
答:重在需求。


16. 为什么到目前为止还没看懂TE的代码和IA的代码及UCC的代码?为什么还感觉那么神秘?
答:因为是没有目的的看,不知道是要从中学什么,当然什么都看不懂了。


17. 为什么对自己写的代码在脑里没有一个清晰的流程?如何做到完全了解自己的程序?有信心?
答:因为没有对设计(有哪些模块,之间如何交互,产生和销毁的顺序)画过图,因为没有特别考虑过软件架构中的那几层。




2009.2.27


今天主要是解决搞成插件之后引发的一些BUG,


1. 在使用ClearCase的时候,因为把文件夹Checkout出来后,导致后面的添加虽然看起来成功了,但是根本没有添进去。后来UnCheckout的时候竟然把本地的内容更改掉了,导致我重写花了不少时间,幸好被搞掉的文件不多,要是多了我就郁闷了。当
答:不管什么时候,当感觉不对的时候,首先做好备份是最重要的,你无法保证后面的操作究竟会造成什么样的后果。


2. 为什么动态创建ComboBox的时候,在exe中可以展开,而同样的代码在插件中却不能?
答: 这个问题大师帮我解决了(在改变ComboBox窗口的大小时,把高度设置足够大),原来ComboBox是没法改变其高度的,设置的窗口大小,仅仅只能影响宽度,而高度是用来影响下拉列表的高度的,就跟在资源中拉的一样.


但为什么在exe中将高度设置成很小也能展开下拉列表暂时还不知道原因?


3. 当资源在DLL中时,究竟哪些情况必须显式设置当前资源句柄到DLL?今天创建任务视图失败,对话框弹不出来,都是这个原因引起的.


4. 移植成插件后,当我把ComboBox的ID修改为9783后,竟然原来的事件触发不了了,恢复成2之后,又可以了,为什么?究竟是什么冲突引起的?


5. 刘海寅今天发邮件说要出双日报,究竟是谁的主意?感觉不在我的控制范围内了?领导喜欢这样的下属吗?
答: 我估计刘海寅以前经常都在发周报,所以这应该是他自发的行为.再次,我估计就算德哥想要关注进度,他可能会告诉我去做,不会直接让刘海寅发的.如果我不喜欢下属的这种行为,说明我管理不到位,嫉贤妒能.所以,对于这种情况,我要做的不是去排斥别人,而是努力提高自己的洞察力,让自己做得比别人更好.




2009.2.28


1. 如何才能从用户口中得到准确的需求,今天打了几个电话?如何准确收集需求?
答:光几个电话是无法获取真实的需求的,必须深入理解客户的业务才行。


2. 如何根据需求设计核心架构,即核心的数据结构?比如我已经确定了消息统计,流程跟踪,时延.


3. 为什么我将想直接向用户调查需求的时候,德哥好像不是太愿意呢,总想按自己的理解直接决定,其实我也有这种习惯,比如告警我就搞错了.


2009.3.4 
1. 在结构的设计上还是存在问题,比如昨天和今天的关于告警,流程跟踪,时延等这些模块该如何定义,放到任务中还是独立出来?


2. 如何才能一次做对,比如告警,之前做了实时和历史告警,并放在单独的视图中,现在又把它放到子窗口中,还是就是告警配置之类的,总是一改再改?


3. 小组长在项目中应该承担一个什么样的角色?我感觉我在项目中还是继续开发,和以前没有多大区别.


2009.3.5
1. 在处理码流的时候感觉还是不爽,需要重新实现类?
CMemFile,CArchive


2009.3.6 
1.带_s的函数为什么老是传错参数


2.如何根据模板的错误信息定位编译错误?或者根据提示去掉告警,今天的正则表达式告警是大师通过去掉stdafx(去掉预编译)搞定的。


3.保存模块如何设计?像目前这样,还是做成handler类的成员,还是handler类从它继承?




2009.3.16
对于像这两天调试的关闭UCC异常,以及前面一段时间遇到的拉动下拉框中的项程序会异常该如何解决?以及最快的调试(如果是调试启动会很花时间,如果仅仅是看是不是还是要挂,完全可以直接启动,我花在等启动上的时间可能都有3个小时,一个人不能太死板,灵活些)?
错误的原因主要还是在程序的初始化和清除(即资源的释放)上,今天又发现SIP也没有这方面的处理,有可能也会造成崩溃.以后写程序一定要首先考虑初始化和清除.
调试时遇到的另一个问题就是对COM不熟,比如为什么释放COM组建会进主框架的OnDestroy.
断点老是不进UCC,以前我明明知道可能是由于代码和执行程序不一致引起的,但是找了一下没找到,就蒙了,可是华仔就知道怎么搞,这就是别人水平高的原因.
还有一个犯的错误就没有好好跟踪代码?
对于将正常和异常的对比也没做好?
由于对BCG这一套的不熟悉,导致程序异常时一直没有搞清楚原理?




2009.3.17 


1.关闭SIP程序时出现死循环,原因是CloseFile调用CloseFile,我为什么就没发现?在写代码时怎么才能避免这种错误呢?
答:感觉还是测试不完全,如果跑过一次,完全能够发现。所有的代码必须跑一遍,这是最基本的测试。这样就能避免这种错误了。


2.在做打开过程数据目录和保存时又出现了重复代码,怎么才能解决?




2009.3.23


在捕获MFC库抛出的异常时,我老是记得书上说最好用引用,但是编译老出错!实际上,MFC库抛出的都是地址,在捕获时应该用指针类型就好了。


感觉MFC库中抛异常的程序很难写,因为一个操作对应好几个异常情况,需要你一个个捕获,不如C风格的返回值简单,我该咋办呢?




2009.3.30
1. 为什么界面改动那么多,像告警,从实时告警和历史告警(单独的),到只有实时告警(放在任务下面),又到单独的视图中,怎么才能避免呢?


2. 为什么界面做这么一个改动,需要动的地方那么多呢?就不可能小一些吗?


3. 感觉目录结构的组织还是不太好,经常我都在变动,怎么就不能一次做好呢?


4. 今天帮陈庭章查看V9代码的时候,因为所有的文件都在同一级,使用的时候是方便了,当你很久时间没看想回去找某个文件的时候,就很难找了,所以,稍微大一点的工程分目录还是必须的,BCG中每分,那是因为别人的代码没有分的必要,都是一个一个简单的继承类,怎么分呢,实在是没必要嘛。




2009.4.7
1.消息处理函数应该搞成保护的呢,还是公共的,还是私有的?
答: 
在VC6.0中,用向导添加一个WM_CREATE的处理函数,默认是保护的,在VS2005中,默认是公共的,看不出什么问题。经常,我们在子类的消息处理函数中都要调用基类的对应处理函数,比如
BOOL CHhh8Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
所以,消息处理函数至少应该是保护的。又由于消息处理函数一般都是由系统调用的,我们很少自己直接调用,故不应该是公共的。综上,
消息处理函数默认最好为保护的。




2.什么时候采用继承,什么时候不用?比如CScenarioTree?


3.InitTree,CreateImageList,SetImageList,Expand之间应该怎样布局才是最好理解和重用的?


4.对于插入的命令节点内容,是外面全部准备好传进去还是界面自己去遍历?


5.遍历插入节点时应该用函数对象去实现吗?


6.什么时候应该拉控件,什么时候应该动态创建,动态创建如何容易地控制控件的位置?


7.在创建树之前要求得树的位置,求位置是否应该封装成一个函数


8.对于CInsertConfigDlg中用到了全局的g_pSimpleInsertImpl,是保存为成员变量后再用还是不用保存直接用?


9.当CInsertConfigDlg中的控件变多,函数变多的时候,就不想其他的CScenarioTree那样一看就懂了,怎么解决?


2009.4.9
1.什么时候用__super?
答:
MSDN上说Names with leading underscores are Microsoft extensions.也就是说,__super不是标准的C++关键字,仅仅是微软独有的。如果考虑移植性、老版本编译器的兼容性,最好还是不要使用__super。




2.对于
CToolBarEx m_wndToolbar;
CBCGPReportCtrl m_wndReportCtrl;
后者更长,放到前面好像更好看,但是工具条是先创建的,在类中该谁前谁后?
答:我觉得还是按控件在窗口中的布局(从左到右,从上到下)来比较好,这样一看成员变量的先后,就知道了窗体中控件的大概布局。


3.为什么那么多地方重写了PreTranslateMessage,仅仅是为了实现Ctrl+C,有没有办法消除重复?


4.OnEditCopy到处都有,如何消除重复,但是又不能用继承,对于CListCtrl和CBCGPGridCtrl
将其传递到另一个函数实现,很爽


5.为啥对于OnEditCopy,FirstUpdateStat,UpdateStat函数,一眼扫过去看不明白?
(
1.代码行不能一屏看完
2.循环太多
3.类型名太长
4.返回太多
)


6.在OnStatMsgInfo中就调用了一个FirstUpdateStat函数,看起来很别扭,是不是这样不对?
答:从公司的编程规范函数部分来看,确实不对。


7.如何在不太熟悉代码的时候,别人一看就能抓住重点,比如CStatView和CScenarioTree.h,是否可以在头文件中描述一下重点功能,流程,函数。
答:确实该这样,否则自己过段时间都没法看懂。在SIP+RTP中,我采取了这样的办法,确实收到了较好的效果,一看注释就回想起以前的实现方式了。


8.成员布局基本上找到方式了。
分为: 构造函数,类型定义(比如枚举类型,私有类),公共接口,虚函数,消息处理函数,私有函数,成员变量(public,protected,private)


9.对于枚举,成员函数中用到了枚举,二者该怎么做?成员函数在前还是枚举在前?
答:在BCG中,枚举在前定义。例如
class BCGCBPRODLLEXPORT CBCGPToolBarImages : public CObject
{
friend class CBCGPDropDownFrame;
friend class CBCGPImageEditDlg;
friend class CMenuImages;
friend class CBCGPDrawManager;


public:
CBCGPToolBarImages();
virtual ~CBCGPToolBarImages();


enum ImageAlignHorz
{
ImageAlignHorzLeft,
ImageAlignHorzCenter,
ImageAlignHorzRight,
ImageAlignHorzStretch
};


enum ImageAlignVert
{
ImageAlignVertTop,
ImageAlignVertCenter,
ImageAlignVertBottom,
ImageAlignVertStretch
};


// Operations:
public:
static BOOL Is32BitTransparencySupported ();


BOOL IsValid () const
{
return (m_hbmImageWell != NULL);
}


BOOL IsReadOnly () const
{
return m_bReadOnly;
}
看来,如果成员函数如果想直接使用枚举类型(不用int代替),这就是最好的办法了。


10.ID_TOOLBAR = 1;是放在resource.h中好呢还是就放在.cpp中好?
答:感觉放在resource.h中好一些,比如当有两个工具条时,如果各自取ID都为1,可能就出现问题了,而在resource.h的话,所有的ID都应该是不重复的,所以不会有问题。


11.CString老是不提示咋办?


12.什么时候用LONG,什么时候用long?在SIP呼叫器中都用了,感觉乱
答:从不同操作系统的移植性上说,用long更好。毕竟LONG是Windows定义的,而long是标准的。


13.判指针是否用NULL,比如if(pButton)还是if(pButton == NULL)
答:后者,因为这样能够明确表明是比较指针,万一哪天指针为空时不是等于0,比如是-1,用前者岂不是完蛋了。


14.static const in MAX_ITEM_COUNT = 100;是放在头文件中好呢还是成员函数中。
答:头文件中。毕竟,下次要修改时在头文件中还是很容易找到的,加上还可以从这个东东看到实现方式。而在成员函数中你就得不到这些好处。也就是说,如果这个东东可能会被改动,或能从中看出算法的实现,最好还是集中放在头文件中。
再推论,最好,我们能从头文件中就得到类的实现,所以以前写在cpp中的文件注释最好也搬到头文件中。




15.为什么CAlarmView::CreateLevelCombo不容易看懂


16.为什么模式对话框向其父窗口发送WM_COMMAND消息,父窗口收不到?
答: 为什么又可以收到了呢
void CAboutDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CWnd* pParent = GetParent();
pParent->SendMessage(WM_COMMAND, 10000, 0);
pParent->SendMessage(WM_USER+100, 0, 0);
}


17.对于列信息及枚举,实在.cpp开始集中设置呢,还是在头文件和插入的时候直接写?
答:我还是偏重于后者,如果是前者,老是需要定义一个值和字符串的结构体,取名老麻烦了。插入列肯定在OnCreate中完成,谁都知道,所以后者不会导致代码不好看。


2009.4.13 
如何解决内存泄露?


如何找到性能瓶颈在哪儿?通信?


如何看明白别人的程序?特别是结构体中成员很多的情况?


对于通信量很大的程序如何写日志文件,如何写调试信息?比如偶尔有一次呼损,如何定位?




2009.4.18
如何在C程序中使用C++的库?
答: 目前想到且应用过的方法是将C++的库包装到一个动态链接库中,并提供C形式的接口(编译时记得在声明中增加extern "C")


实际上,只要把函数定义嵌在extern "C"中就行(不一定要放在动态库中,比如map.dll多么麻烦啊),让C包含的头文件不要带extern "C",因为C语言中是没有这个关键字的,而函数定义(C++)可以包含这种不带extern "C"的头文件,虽然和实现不一致,但是一点问题都没有。(今天在支撑体系上发了个傻言,丢死人了)


学会使用hash_map,它和map比起来会快很多吗?
答:如果你不自己提供hash函数,它的用法完全和map一样。例如
#include <hash_map>
#include <iostream>
#include <algorithm>
using namespace std;
using namespace stdext;


void print(pair<int, int> elem)
{
cout << elem.second << endl;
}


int _tmain(int argc, _TCHAR* argv[])
{


hash_map<int, int> hashmap;
hashmap[2] = 2;
hashmap[1] = 1;
hashmap[6] = 6;


for_each(hashmap.begin(), hashmap.end(), print);

int dummy;
cin >> dummy;
return 0;
}
一般情况下,hash_map并不比map快,除非,你分配适当的桶数(如果允许的话,尽量让桶数等于元素的个数,这样如果hash值求得好的话,一次就定位到要找的元素了),并且自己提供优秀的hash函数(网上有hash字符串的最优算法,如果你的元素的key有规律,也可以自己写),以便让元素均匀的落在每个桶中,当在查找时,桶中元素的个数小于用map需要比较的次数时,才比map快。默认情况下,hash_map好像只分了4个桶,相当于少,所以基本上还不如map效率高,要高效,估计得我们自己提供hash算法和桶数。虽然默认是4个,但是正如张尹给我讲的那样,实际山STL中的hash也是动态的,即桶数会动态调整的,否则那不慢死了!


2009.4.27
1.如何学会管理和处理关系,比如小泉,刘海寅


2.为啥丢包搞了了那么长时间,为啥没有早早发现是网络的问题


3.对于组长不了解业务怎么办,比如sip


4.遇到想sip这种写得不好的代码怎么阅读


5.为啥sip项目出现那么多问题,那么多风险,好多东西没有严格测试,使用那么复杂




2009.5.11
德哥:
能隐的,不好的尽量不说,比如我的抱怨邮件
写作能力,从看邮件的人出发
固执
日报,从领导角度出发,进展,是否有延期。


师傅:
1.计划,卡时间点(倒推方式)
2.改善关系(私下吃饭),刚开始可能不接受,可能后面就好了。
3.奖惩分明(做得好的发邮件鼓励)
4.告诉领导自己遇到的困难,风险
5.换人
6.和用户确定规格




为啥刘和陈改出的性能和内存泄露问题那么久才发现,害得我花了那么多时间去定位?


答:对于关键用例(比如SIP中的性能和内存泄露),必须保证每天都能通过。所以,在一个项目开始的时候,需要先确定一部分关键用例,每天有人负责测试,及时发现问题及时找到原因,所以每次CheckIn的代码必须保证是能够运行的,比如SIP中出现过连续一段时间的都不能运行的情况,等到可以运行的时候,代码已经改了一大堆了,怎么好定位呢!




2009.5.12 
1.为啥RandomInteger+new_callid消耗的时间不等于整个create_session_callid的时间,难道是中间刚好有线程切换吗?怎么才能准确地求出一段代码消耗了多少CPU?




2009.5.14
1. 在迭代之前,必须把系统分解成小的开发单元,这是真正考验架构能力的地方!为什么在SIP开发过程中无法做到,比如media_ip,branch_int都是些没有预料到的东西?


2.如何验收迭代?如何自动回归以前的功能?在SIP呼叫器中到位前为止我都没找到答案


3.send节点无法带next属性,如何避免?
对业务理解不清楚,只能尽早用真实业务去验证才能发现问题,需要客户尽早参与,闭门造车搞不定。


4.无法打印变量
对客户预料不够,即调试能力不足,跟SIP呼叫器一样,一定要做到随时了解整个系统的状态,像show_status一样


5.让先验证一下再给客户,结果没验证,说什么没环境,一直到今天还说我的代码有问题,不知道以前他是怎么验证变ip和端口的
我们应该保证用户可以验证的手段自己先验证到,出现问题知至少也要保证是新问题。


6.停止任务时保留呼叫结果
对应用场景了解不清楚,怎么办呢?
做大的问题是对业务和使用场景不了解,唯一的解决办法就是尽早用真实业务来验证,在使用中发现需求和设计,刚开始尽可能设计得简单,追求尽快最基本的功能,比如告警这玩意,直接写文件,或者打印出来都可以,不需要搞那么花哨


7.在UCC,PalTraffic,SIP呼叫器中,都有显示实时告警,为什么就不能封装起来,每次我们都得重新写,烦死了!


8.为什么我老是怀疑适配器和界面之间采用共享内存的可用性,为什么适配器和界面之间那么多接口,是不是说明两个模块之间的功能划分有问题?




2009.5.22 
1. 为什么定时器函数写在控件类中时,必须得把基类的处理函数去掉才能正常进行,否则进大约两三次就没有了?
答:注意,不是写在控件类中的都不行,而是只有放在CListCtrl中的才不行。参考MSDN对CListCtrl的描述如下
Knowledge Base article Q200054: PRB: OnTimer() Is Not Called Repeatedly for a List Control
还有一点需要注意,如果在CListCtrl中添加了对WM_TIMER的消息处理函数OnTimer(),就算你没有创建自己的定时器也照样有WM_TIMER消息过来,也就是说,在CListCtrl的内部,已经默认创建了一个定时器,通过在OnTimer()中打印它的定时器ID,发现ID为45,间隔为500ms。这也是今天突然间发现CListCtrl中的定时器不准的原因,因为实际上有两个定时器。
显然,在SIP+RTP的日志处理窗口中,要想按我自己的想法定时去取数据,得在OnTimer()中判一下定时器ID,否则就和我自己的设计偏离了。


在公司参考了Q200054以后,终于知道原因了,正确的写法是:
void CLogListCtrl::OnTimer(UINT nEventID)
{
if ( nEventID == ID_MY_TIMER)
{
// 
}
else
{
CListCtrl::OnTimer(nEventID));
}
}


2. 在写C程序时,一般以单个文件为模块,相当于C++中的一个类,对于每个函数,都应该在头文件中列出,并且自己加一个私有,公共标志方便阅读,这样我们就知道哪些是接口函数,哪些是私有的了(阅读sip代码有感)。
如何将C++的特性应用到C程序中?




2009.5.25 
1. 为什么我觉得工作上老不顺心,或许这也就是小泉,刘海寅当初的想法?
答: 
a.觉得项目的成功对组长更有意义,对自己意义不大,所以积极性不高,有时还有希望项目失败的想法,以证明组长做得不好,决策失误,是组长没有听自己以前的建议造成了失败,证明自己不比组长差(PM应该尽量避免让相同级别,存在竞争关系的人出任组长,比如让我带两个新员工可能比带刘和陈更好,都是强兵猛将并不一定能产生好的效果。如果必须这样,组长可以自己花钱但是说这是项目经费请组员喝喝酒,聊聊天,一起抱怨抱怨,同时让组员对项目充满信心以改善私下关系,当组员对你不反感的时候,工作就好开展得多了。这一条最重要,搞得好后面好多事情都很好做。在SIP叫器中犯了)
b.力图把自己负责的部分做好,以便在失败时让自己脱离干系,所以积极希望把模块划分清晰,接口明确,分工明确。在责任不明确时心里焦急烦躁,因为项目失败无法让自己脱离干系(组长如果能协助把模块分配好,责任到人,不要让组员自己去分配任务的话,效果会好很多。在SIP呼叫器中应该出现了目前我和鲁出现的情况,组长应该出面,但是此时组长会不会担心干涉太多呢,万一组员之间没有这种情况就惨了,组长如何判断已经出现这种情况了?直接问组员是如何分工的,问到我可能会找点东西搪塞一下,不会说我们配合出了问题,估计把组员召集到一起明确分工一下还是不错的选择,管他配合得怎样)
d.对项目做好没有信心,比如我就觉得杨负责的东西太多搞不定,对自己提出的意见老是遭到反对,说什么组长都有理由反驳(组长应该慎重对待组员提出的每一条意见,如果不是特别不合适的,尽量采纳认可。在SIP叫器中我把组员大多数都否定了。要是真的不认可怎样办呢?比如配置界面,简单插入功能,架构?建议可以采用缓兵之计,先不要否决,可以说要不我们先用某个方案做,等后面发现不合适了再用你的方式,对,这样组员心里好过些)
e.和自己负责同一块的人分工不明确,没有当初我和黄建那样的分工(这是组长做得不好,组员之间不协调)
f.找别人讨论界面框架的时候,别人不愿意理会,理由是他自己那一块的东西没搞定,没空。他是怕到时我把事情搞定了,他的那块没搞定,怪罪的就是他。(这条比较难解决,如果帮别人一起改,可能会修改别人的代码,造成新的矛盾,还有就是本身就不愿意看别人的代码,看着难受)
g.界面框架和各接口不确定,导致后面工作很多,但无法开展工作。(应该由组长首先应该关注的,组长做得不好,组长首先关心的应该是任务划分得怎样,有没有风险)
h.本来想把自己以前的劳动成果运用到当前项目,比如问题单列表,组长不是积极接受(组长应该仔细评估,最好能认可接受,或以委婉的方式让组员做适量修改)


3. 当组长的反感什么,喜欢什么?
a.有时会担心组员喧宾夺主,比如提出很多好建议,并且抄送给了领导,虽然心里有点不爽,但是仍然认为组员积极性高,值得表扬,评价是也会给予高的评价(那就别抄送领导了)
b.和组员讨论问题时意见不一致,争论得面红耳赤,心里也会觉得不爽,但不会影响对人的看法,也会认为是积极的(组员让步,提出意见,组长不理解就算了)
c.希望组员能对组长尊重一下,讨论的时候不要板着脸,说话不要太绝对(对,我应该学学)
d.不喜欢组员抱怨对自己的项目堪忧,有时希望听到别人的赞扬,比如说你的日志模块对我定位问题帮了大忙,很有用,我会对他产生好感,希望组员提出问题时,能同时提出解决办法(找到可圈可点的地方)
e.不喜欢组员越级,组员可以表现得很好,我也喜欢,也会记在心里,但是我不喜欢你在我的上司面前表现。
f.当认可某位组员时,我会在考评时出现偏颇,虽然偏颇不大,但至少不会往坏里打,比如黄
g.不喜欢别人太嚣张,其实组员也不喜欢组长太嚣张,人都有那个习惯,你说你很强,我就希望你失败(我要低调)
h.喜欢组员把自己说的话当回事


4.当不满别人做的不好的地方时,该如何提出来,别人才乐意接受
a.例如,我老觉得郑总是乱改,比如通信模块,不加验证,说安装盘是好的,我只需要往其中加就行了,但问题很多,我该如何提出?(今天直接在德哥面前抱怨他了,这是我做得不好的地方,可惜我除了抱怨实在没办法了,怎么办?)
b.对他支持用户不满,写的程序差不满(怎么办?)




2009.5.26
我对这个项目不满的地方?
1.没有继承SIP呼叫器中已有的成果
2.多进程架构不合适
3.采用内存映射的方式不合适
4.没有采用尽可能做得少原则
5.缺少调查,没有实际的用户支持经验,号称强势有用吗
6.中途加入的人不能发挥作用
7.不相信他能修改得很好,对SIP协议不熟
8.较主观,听不进去建议,无法讨论,固执




2009.6.2 
1. 在使用BCGPToolbar时,因为动态添加了按钮,但总是刷新不出来,原来是少调用了RecalcSize函数,导致花费了至少半天时间,耗时大,如何解决?




2009.6.10
1.在RTP+SIP中,当自己不能主导设计时,如何适应别人的设计?如我和杨之间的冲突,我和鲁之间的冲突。
答:其实没有必要去争论,只要程序将就能写就行。因为就算是差的设计,有缺陷的设计,复杂的设计,比如不能实现sip一运行就启动流程跟踪,别扭复杂的内存映射数据传递方式等,程序也不一定就会出现问题,我只要封装好,把易发生错误的地方隔离出来专门处理(不要让复杂性到处都是),也不会造成什么大问题,这样就算以后要重构也很容易。


2. 为什么老是不能把握住用户的需求,即做最少的事情去满足用户,比如时延,流程跟踪,消息统计,告警,为什么我都做那么多电话调查还是感觉没把握?如何很好的把握需求?


2009.6.15 
1. 有时在resoure.h中添加了一个ID,且在cpp中已经包含了这个resource.h头文件,但是编译时就是提示找不到这个ID?
答:这是由于在包含resource.h时没有采用具体路径引起的(鲁建华发现)。


2009.6.16 
如何理解需求办法之一:之前设计SIP呼叫器界面的时候,打电话问了那么多人,结果好像什么都没得到。其实问的问题中,好多都是sipp的。今天下午安装了sipp,并看了它的文档,没想到使用起来那么简单,功能那么强劲,比如号码从文件导入,停止,时延设置等疑惑的问题,在其中都有答案,感觉它的解决办法比我们的合理多了。由此,我们可以得出,在设计一个东西之前,首先要了解业内的行情,比如你在设计压力测试工具之前,你不了解,不会用业内流行的几款工具,你能想出、设计出什么好的东西来吗!其实学习商业工具,没有我们的工具难。比如今天看的sipp吧,那么容易就学会了,只要你有耐心,耐住性子看看文档等,应该都会使。
综上,发明一个东西之前“必须”先要了解业内的行情,这样才能更好把握需求,事半功倍。


2009.6.29
对于那个图,搞了两天但是心里老是没底,总感觉自己没思路,自己都不清楚应该搞成什么样。
比如一创建后mark,counts窗口应该处于什么状态,第一次放大应该除了处于什么状态,窗口放大时各子窗口应该处于什么状态,需要哪些成员才能维护需要的状态等等。对于自己都没有确定的东西,老觉得这样也行,那样也行,结果什么都不确定,什么都没把握。所以,不管是不是最好的方式,先确定下来具体要做成什么样,再开始动手才行。
除了上面的,还要确定好各个实体的关系,比如主窗口负责什么,mark窗口负责什么,counts窗口负责什么,先把之间的交互关系,接口确定下来再做。
最好是把这些关系,状态变迁用文字描述下来,如果能写到代码中作为注释就最好了。




2009.7.1
1.就算我我预测到我的chart中可能有多个serial,我能怎么办呢,详细分析如何实现,万一没出现多条的情况,我的时间岂不是浪费了?!也就是,我们如何在灵活与过设计之间找到平衡点?


2009.7.2 
如果已经找到对象,目前正在实现这个对象,那么你首先要关注的是与外界的接口(和哪些对象有直接交互),最主要的是可能引起内部状态变化的接口,当然,内部状态有哪些,此你也应该搞清楚。
不管是程序,模块,类,还是函数,如果你一句话不能概括它,可能它的设计就有问题,也许就是低内聚的。比如今天绘图窗口中有的函数名明显的不能表达它的实现,显然有问题,改了以后,可以用一句话表述它之后,终于解决了逻辑不清的缺陷。并且如果一个函数不是只做一件事情,别人调用你的时候很难处理,比如我只想要你做一件事,你却把我不想要的事情也做了,例如之前的SynMarkWndPos




2009.7.7
1. 为了实现工具条Text below image,差不多花了我两天时间,怎么会花那么多时间呢?刚开始BCG调试不了,后来发现时没找到DLL对应的pdb文件,重新编译一下BCG就好了,看来它默认安装的还不一定都好使。BCG在修改了工具条后,老是要删除注册表才能生效,有没有什么好办法?调整了一下PC中的代码,怎么工具条就是不正常?文字就是不出来,通过调试,发现是工具条有个属性值没设置,文档上说这个属性默认是开的,而在我的测试程序中确实默认是开的,怎么到了PC上就不是了呢,看来只有代码是最可信的,其实好好调,也是能解决问题的。后来又发现图片老是不对,因为工具条共享了所有的BMP图片,此时我就没好好调了,叫上鲁建华,他就知道看看LoadBitmap,我提了个建议,先改改lock参数试试,虽然他觉得不可能,但是还是试了,结果还真和lock有关系,也就是说,当一个人思维僵化的时候,解决问题的能力已经下降了,此找一个人换一下思维还是很好的,并且两个人在一起解决问题可以思维互补,更有助于解决问题,我需要提高耐心,老老实实调代码的能力,不要一搞不出来就急,不能太依赖于文档,应该更相信代码。




2009.7.10
1. 今晚用TRACE0( _T("TimerProc\n") );的时候,竟然编译通不过,告诉我error C2065: “LL”: 未声明的标识符
答:通过定义
#define TRACE0(sz)              ::AfxTrace(_T("%s"), _T(sz))
#define TRACE1(sz, p1)          ::AfxTrace(_T(sz), p1)
#define TRACE2(sz, p1, p2)      ::AfxTrace(_T(sz), p1, p2)
#define TRACE3(sz, p1, p2, p3)  ::AfxTrace(_T(sz), p1, p2, p3)
你可以发现,其实它们已经给格式化字符串加过_T了,如果你再加,那么当是UNICODE版本时,相当于字符串前面就是双LL了,也就是说当用这几个宏时,格式化字符串只能用ASCII字符串。
但是,TRACE( _T("TimerProc\n") );却是可以编译通过的,定义如下
#define TRACE              ::AfxTrace

void AFX_CDECL AfxTrace(LPCTSTR lpszFormat, ...);
显然,通过是正常的。


2009.7.15
今天在写任职等级评定胶片时又严重受挫,平时做了些什么,输出的文档等都没有记录,导致根本没有什么可写的,郁闷,平时要多记录呀!


今天参加用户大会,别人提到的Spider,TNCC,GTR,核心网的那些网元、组网图一点都不了解,怎么可能可能和别人进行良好的沟通,方案的设计呢?


2009.7.16 
1. 在SIP+RTP中,虽然已经考虑避免任务修改,删除,状态变化时的同步问题,但是,在时延图形显示时,还是出现了同步问题,究竟怎样才能避免这些问题!




2009.8.13
1. 以前为什么老觉得不需要胡勇?
答: 这主要还是我的性格问题,老是不相信别人,除非别人已经让我相信。经过这段时间的磨合,特别是这次测试中看到胡勇主动承担责任的表现,我顿时对他的看法有了转变。要用一个人,首先是你要找到事情,然后就是要充分的信任别人,适时地再跟踪一下情况就行了。我这么喜欢积极承担责任的下属,我在领导面前,是不是也是这样呢,值得反思!


2. 为什么上半年考评不好?
答: 一方面,是宣传做的不好,我老是看到不好的一面,这让领导就真的认为是不好了,我应该习惯好看到好的一面,谁都不喜欢听不好的话。另一方面,我亏在了360调查,也就是刘海寅的手里,和别人打成一片,搞好关系,估计比解决一个严重问题好得多。我解决了那么多严重问题,最后还不是得了个B么。第三,不要惹领导眼里的红人,比如杨志周,张尹,惹他们就等于惹领导,你说谁好,那我就说他好,反正对我损失也不大,说不定还能得点好处,跟领导的红人比过高低只有自己吃亏的。第四,有几次邮件估计也有点影响,这次胡勇的事,同样这样,我可不能走边江的老路。
下半年,如果360度调查到了杨志周和鲁建华手里,我的考评也好不了哪儿去,虽说好的领导要容得下属下的意见,但是不是人人都是好领导,有冲突别人就会对你有意见,不要图一时爽快得罪了别人,特别是一些小的方案。
让我们都开始忽悠对方吧!













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值