首页 > 代码库 > 成长日记--记录在WB的第一个项目。

成长日记--记录在WB的第一个项目。

    具体为什么跑去外包,只能说自己太水了,或者太懒了,都不好好投简历,也没入这个坑过,如果有想去外包的,除非钱给到市场价的1.5倍以上,否则别考虑了。

    项目是国内第一做通信公司的,从具体的需求说起比较好,不,还是要从一个坑货项目经理说起,说起这个项目经理,不得不服他,测试出身,来带我们这个开发团队,开发团队里很多大牛的,HW的工作5年+三星工作3年的,HW工作10+的,ZX工作8+的,ZX工作10+的,HW工作到退休的,具体就不一一说了,反正团队的能力毋庸置疑,但是这个项目经理完全不懂开发,不知道什么就需求分析,设计,code,自测,转测等,就连code review都不知道,然后还在那瞎指挥我们,导致我们一直在瞎转,赢了同事一句话--一将无能,累死三军。虽然我不该说领导不好,可是还是忍不住吐槽。说正题,从项目需求开始说,11月底的时候告诉我,12月有个小需求让我来做,问我敢不敢接,我的性格你们不知道,有毛我不敢接的。然后问了下大概做什么,大概11月30号左右拿了他们的模块的设计文档来看,因为没完全没接触过通信这块,再加上对他们的系统不是很熟,导致下面的2周很苦逼。12月1号(周4)起,就开始细看他们的文档,大概看了2~3遍,然后周5过去HW去让他们补习下,听了他们讲的,和我理解的差不多,业务部难,应该说业务很简单,应该不会出什么事,也没怎么上心,然后就开始细看他们的代码,在哪里准备加代码,表示心里有数,大概发了5天左右(上午还要给HW的人打杂,做日志分析工作)编码完成,心虚,因为是一个完整的新的模块,自己周末又过来code review了2~3遍,感觉基本没什么问题了,开始找HW的人review,然后就开始一坑接一坑了。

    忘记说了,编码阶段,有些不确定的地方,主要是逻辑这块,新的业务逻辑该是什么样的,我写好了代码,发过去给HW的人看,就是为了确定业务逻辑有问题没,然后他们说没问题。然后codereview完了,发现原本的一个RBTREE支持不了现在的业务,必须新加一颗静态树来作为副本存原来的静态树结构(只是key不一样),这里要记录下,原有的树胶Tree1,副本树胶Tree2,没问题,以为改也不是很多,我大概发了一个下午把树的逻辑给加上去,然后自己review,感觉差不多了,没什么问题,找他们做第2次review,他们细看了下,发现业务逻辑还是有问题,说树2的节点不能这么玩,你这树2的节点对应树1节点可能是多对1,必须要在树的节点上在加个头链表,听到这话首先是不开心,但是没表现出来,因为树当时写我是按1-1来处理的,他们是DE,这么重要的信息在我编码完成后才说,这是坑我。如果是1对1,基本没什么问题了,但是1对多,这个逻辑肯定要大改,我就说这么重要的信息,你让我一个刚接触这个模块的人想,反正是大家都不开心,如果没有这个问题,我写的代码,基本就4个小问题(注释没删,笔误一个数组的下标全写出0,一个字节序对齐,还有个什么不太记得了),但是不开心归不开心,心里不爽,这个坑不该我来背,代码还是要写的,其实我还是喜欢写代码的。

    大概又花了1个下午加晚上,代码完了,review的时候也没什么大问题,刚开始,后来到新改的逻辑的时候开始巨坑出现了,HW的人说你这个时间复杂度和空间复杂度高了,说我不是跟你说怎么怎么写了吗,我当时直接蒙了。。。

    先说空间这块吧,因为节点上挂链表,我就直接在tree2Node上挂一个链表指针,然后又不同的value就直接申请内存往这个list上加,他们说你这么加的不是我说的那样啊,这样加有问题,你自己申请的内存虽然很小,但是平台管理内存的模块会加系统的头,你这个链表如果有1000个节点,那么你这内存就是1000*(你申请的内存+系统头40多个字节),这个内存浪费太厉害(我心里不开心,这我刚来这个外包公司做第一个项目,身边都没人做过你们的东西,都是新来的同事,才组建的团队);另外,我记得和你说过,如果是遍历,觉得不能用list(这话他确实说过),时间复杂度太高,我心里开始心虚了,这话是说过,我这么写性能确实不好,我说是的,这块代码这么写被我玩坏了,是自己的问题就勇于去承认,这个不是什么丢人的事情。反而我觉得前面关系一对多,这个坑我觉得下次你们写设计的时候希望也多想想,别什么都指望一个刚入职不久,刚了解你们的框架,看都没看过你们模块的代码和一点都不了解你们业务的人来考虑,好了吐槽结束,最后的解决,他们一个大牛帮我整改了下,解决。

 

    说点心得吧,数据结构被他们玩的厉害,这个是真心的,树和链表,循环链表写的确实好,思想很厉害,被坑了这么长时间,联调还没开始,原计划13号联调的,我脱了你们的后腿,心里还是很抱歉的,虽然双方都有责任,但是答应你们的事情没搞好,心里很不开心,真心的。

 

    说点技术在最后把,他们的树节点封的特别有意思。

typedef struct node_common
{
    struct common_node *pParent;
    struct common_node *pLSon;
    struct common_node *pRSon;
    COLOR color;
}TreeNodeCommon;

typedef struct person_node
{
    int iAge;
    char sName[60];
    char sTelNum[20];
TreeNodeCommon
* pCommon;

} Person;

比如这样的一个人节点,定义一个实体Person xx,他们把xx.pCommon的这个地址提出来作为key值插到树上或者其他的数据结构上,这样遍历树去找这个xx的时候,要先找到这个xx.pCommon的地址,很显然在内存中偏移下,就可以得到xx的地址了,还是很厉害的,真心的。

成长日记--记录在WB的第一个项目。