具体为什么跑去外包,只能说自己太水了,或者太懒了,都不好好投简历,也没入这个坑过,如果有想去外包的,除非钱给到市场价的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的第一个项目。的更多相关文章

  1. 菜鸟成长日记之新手备忘录-IOS开发第一个项目总结

    2013年5月3号,开始找IOS开发工作(自学了大半年,做了一个功能不全的Demo,该出去见见世面了!),5月4号面试了第一家公司(是家刚成立一段时间的外包公司),5月5号第一家公司已二轮电话面试,5 ...

  2. DevOps 工程师成长日记系列二:配置

    原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-2-config ...

  3. scrapy爬虫成长日记之将抓取内容写入mysql数据库

    前面小试了一下scrapy抓取博客园的博客(您可在此查看scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据),但是前面抓取的数据时保存为json格式的文本文件中的.这很显然不满足我 ...

  4. C++添加简单的日记记录

    #include<fstream>#include<iostream> using namespace std;//这是一种日记记录 b 种void LOG(char *tx, ...

  5. DevOps 工程师成长日记系列一:必备知识与技能组合

    原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-366097df7737 ...

  6. 第一个项目:Python pygame——外星人大战(心得)

    2018年12月,作为一个大学专业是物联网工程,毕业后在一家石油行业国企干了近三年,但内心依然有着一颗技术之心的我,通过一次偶然的机会(也许并不偶然),接触到了python.当时抱着玩一玩的心态开始通 ...

  7. .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块

    .Net Core ORM选择之路,哪个才适合你   因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...

  8. VB的第一个项目

     前言-----本人也是刚刚接触VB,企业的VB代码基本能看的懂,但是自己开发,只能呵呵.一般在刚学习一门新的语言时,很容易发生一些自己相当然的认识错误,so,记下并分享开发学习的过程,望指正.--- ...

  9. 【02】Jenkins:第一个项目

    写在前面的话 通过上一节我们成功的搭建起来 Jenkins,那么接下来就是体验如何构建我们的第一个项目了.当然在这之前我们得专门针对 Java 环境就行简单的配置. 全局工具配置 其实这次配置的主要还 ...

随机推荐

  1. wordpress 拾遗

    wordpress 拾遗 运行环境 php mySQL Apache 集成开发环境 Appserv xampp phpstudy 文章和页面的区别 文章是发布网站主要内容的地方,比如博客的文章,商城的 ...

  2. 【Codeforces Round #476 (Div. 2) [Thanks, Telegram!] D】Single-use Stones

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 设长度为L的所有区间里面,石头的个数的最小值为k 设取到k的区间为l,r 那么k就为最多能通过的青蛙个数. 假设k再大一点.比如为k ...

  3. ASP.NET-HTTP响应标头

    Reponse Headers 理论上所有的响应头信息都应该是回应请求头的.但是服务端为了效率,安全,还有其他方面的考虑,会添加相对应的响应头信息,从上图可以看到: Cache-Control:mus ...

  4. android启动第一个界面时即闪屏的核心代码(两种方式)

    闪屏,就是SplashScreen,也能够说是启动画面,就是启动的时候,闪(展示)一下,持续数秒后.自己主动关闭.  第一种方式: android的实现很easy,使用Handler对象的postDe ...

  5. 拿到offer过后--大学最后时光最想做的那十件事

    昨天--2014.10.26,历史性的一刻,激动的签了欢聚时代(YY)的前端开发offer,工作地点是我喜欢的珠海(仅仅由于那边有我所向往的海还有自行车队,如今想想都乐开怀了,绕着海边骑单车的感觉真妙 ...

  6. php给图片加入文字水印

    PHP对图片的操作用到GD库.这里我们介绍怎样给图片加入文字水印. 大致分为四步: 1.打开图片 2.操作图片 3.输出图片 4.销毁图片 以下我们上代码来详细解说每步的实现过程: <? php ...

  7. 16、sockect

    一.局域网因特网 服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序,而网络用于连接服务器与客户机,实现两者之间的通信.但有时在某个网络中很难将服务器和客户机区分开.我们通常说的“局域 ...

  8. Qt 3D教程(三)实现对模型材质參数的控制

    Qt 3D教程(三)实现对模型材质參数的控制 蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/47131841.欢迎同行前来探讨. ...

  9. (OpenGL ES 2.0 Shading Language) attribute 、uniform 和 varying

    一:attribute .uniform 和 varying 都是glsl的变量的内存指示器(storage qualifiers),指明变量的内存特性 二:attribute attribute 是 ...

  10. C/C++数据类型的转换之终极无惑

    程序开发环境:VS2012+Win32+Debug 数据类型在编程中常常遇到.尽管可能存在风险,但我们却乐此不疲的进行数据类型的转换. 1. 隐式数据类型转换 数据类型转换.究竟做了些什么事情呢?实际 ...