Skip to content

Latest commit

 

History

History
executable file
·
80 lines (57 loc) · 8.07 KB

chapter_013.md

File metadata and controls

executable file
·
80 lines (57 loc) · 8.07 KB

编程高手

第13章 树型结构

郭竞离职之后,一直悠闲于算法的研究。但有一天,有一保山然的机会,却入职了一下以营销为主业的公司。一开始,郭竞挺开心的,因为,他听创始人讲,公司目前要向技术公司转型。

但是,入职第一天,郭竞接到的第一项任务是,做一个SAAS平台,这个平台兼有CRM(客户关系管理),PM(项目管理),OA(办公自动化)等功能。既然是SAAS,那么,首先考虑的是用户画像。具体是哪一群用户。结果,沟通下来,则是首先切合公司目前的需求。但公司需求也太多了。整个项目没有优先级。 郭竞想到,一个平台的成功,特别是要做到技术驱动,则必须要有技术创新。所以,接手这一任务之后,想着手先做方案设计。希望有可能在目前最具体最切实的需求之下,能够找到一些创新点。

于是,郭竞开始先进行竞品调研。根据郭竞的了解,他希望研究一下SUTE-CRM, OPENERP, SALEFORCE等知名品牌。 于是,他开始下载SUTE-CRM,并进行安装配置。完成后,打开进行界面操作,以及数据结构分析。可正在此时,公司微信群中,公司的某位创始人突然发了个消息。“发现公司有两名同事没有在干本公司的活。希望这两位同事注意一下!”。郭竞没当回事。

第二天,技术会议上,有同事居然不会把数组展开成树。为此,会后,郭竞向技术总监在微信中发了代码。

   /**
    * @param $parent_id_key
    *
    * @return array
    */
   public function toTreeArray($parent_id_key = 'parent_id')
   {
       $src_array = $this->toArray();
       $out_array = [];
       $ref_array = [];
       foreach ($src_array as $key => $item) {
           $parent_id = $item[$parent_id_key];
           $item['is_leaf'] = 1;
           $item['children'] = [];
           $id = $item['id'];

           if (0 == $parent_id) {
               $ref_array[$id] = &$out_array[];
               $ref_array[$id] = $item;
               continue;
           }
           $ref_array[$id] = &$ref_array[$parent_id]['children'][];
           $ref_array[$id] = $item;
           $ref_array[$parent_id]['is_leaf'] = 0;
       }

       return $out_array;
   }

这可是郭竞多年来一直使用的代码。其一,可以指定parent_id的字段名。同时,向客户端提供了'is_leaf',方便客户端判断是否还有子节点。其次, 通过引用,未使用任何临时变量。郭竞出于好意,发给了技术总监。但万万没有想到的是,这位CTO却回复了:“不要这么复杂,4行代码就够了!”。CTO的代码如下:

   foreach ($items as $item){
        if($item['id'] == $items[$item['id']]['id'])
            $items[$item['pid']]['son'][] = &$items[$item['id']];
   }

郭竞拿到此代码,怎么也看不明白,并且,通过某在线代码运行,也写了很多测试用例,可就是得不到想要的结果。对此,郭竞认为,如果这个代码可以运行,那也是一个奇技淫巧,并且,这个要展开成树的数组肯定有特定的一些先决条件。并且,这个所谓的四行,还刻意省掉了两个括号。所以,郭竞心想,难怪这家公司要向技术转型,本来技术就不怎样。

当新的一天到来,技术部在次技术会议时,CTO并没有检查郭竞,那个平台方案设计如何,而是直接布置了一个小工具。这时,郭竞猜测,因为那个树结构,CTO可能认为郭竞写代码不行,所以,直接改为考核写代码了。

要写的东西也相当简单,面试人填表,公司HR审核。后端接口,很快开发完成了。同时,接口中也增加了基于OPENAP的SWAGGER测试页面。但让郭竞没想到的是,团队居然没有人用过SWAGGER.

第二天会议上,涉及到移动端的技术选型问题。郭竞提出来使用UNI-APP,以方便未来多端支持。CTO则说,哪个快用哪个,你最熟悉哪个就用哪个。前端负责人则说,UNI-APP太重了。就一个页面,直接通过SCRIPT SRC引用即可。郭竞不解,凭什么说这个交互就相当的简单,要填写将近30个字段,三步表单,凭什么就不要用VUE CLI创建项目,后续如何扩展与维护?可是,官大一级压死人。

最后会议也没有明确给出方案。郭竞最后与CTO沟通,结果是,为加快速度,选一个已配置好的START-KIT。最终确定为vue-h5-template.

监于后续要用微信与求职人联系,郭竞想到,最好添加微信登录。没想到CTO说,能用微信登录那就太好了。可以拿到求职人的手机号。郭竞不解,微信登录能拿到手机号,所以,与CTO再次确认了一下。结果,得到的答复是,可以的,现在微信登录只要静默登录,就能拿到!

尽管郭竞心中有很多怀疑,但因为时间紧,并没有去网上验证他的说法。直接开干了。花了一天时间完成了微信登录。但却得不到想要的结果,其后,他只好找CTO去要获取手机号的方法,结果呢,拿到了一个获取收货地址的代码。

郭竞不得不问,假如在腾讯平台产从未有过购物行为,哪里来的收货地址?这就是说,并不是每一个人都有收货地址的。结果,费了一天开发的功能只能废弃。郭竞觉得相当郁闷。

两天后,郭竞按要求,要发布开发完成的东西了。结果,服务器是专人管的。第一天晚上,发布了一个多小时,结果测试下来有问题。服务器本身配置了宝塔LINUX面板,但是,居然没有配置GIT的钩子。所以,要用U盘把SQL以及前后端源码先复制上去。郭竞不解,既然这么做, 为什么还要用宝塔?即使没有配置GIT的钩子,上传代码也相当方便呀。并且,服务器是UBUNTU系列的。可发布项目的人,每一次操作都忘了使用sudo。

把简单的事情弄复杂,相当简单。把复杂的事情弄简单,真的相当复杂。郭竞想,本来,宝塔密码提供一下,三分钟就能解决的问题。并且,有问题,后续改一下宝塔密码即行。这多简单,结果,等到最终发布时,因为,多次数据库导入不成功,前后折腾了4个多小时。

又一天,公司某合伙人追责项目超期原因。认为,郭竞作为这么资深的专家,不应该走微信登录的弯路,并且,前端应当安排给前端的人来开发。而不是做自己不擅长的。并且,不由分说,公司某合伙人说完后即通知郭竞,因为,这个三个页面的项目超期,所以,试用期不合格,让郭竞主动申请离职。郭竞突然发现,他的猜测一点都没错。顿觉一身轻构松。

郭竞深深感到,一家公司的遗传基因,决定了这家公司未来的发展,转型是相当痛的。特别是传统行业要向技术型公司转型,风险是相当大的。因为,没有一个合伙人懂技术。特别是软件与程序相关的技术,结果,做出来的东西就是技术负债,而不是技术资本。而一个资深技术人,如果不在合伙层面,而是在技术团队中,特别这样的公司的技术团队中,束手束脚地干活,只能是一事无成。

另一方面,郭竞也觉得,为什么微软的副总裁当年到ADOB,最后觉得各种不适应。但即使如此,人家能够做下来,挺过来,那是因为,他首先仍是管理层的人士。所以,除了自身要能适应公司的不同的情况的同时,另一方面,也要认请,当你做过项目经理,最好不要再做程序员,否则,你的价值根本发挥不出来。所以,人才如何与公司匹配,这是双方都要考虑的,并且是相当重要的问题。

上一章 目录 下一章