全栈不仅是会开发那么简单

许多“有抱负”或者热爱编程的程序员,对全栈工程师可能都是孜孜以求。全栈是一种极客精神,对软件的每一种编程语言、每一个开发平台都有着浓厚的兴趣,并愿意为之付出努力,全栈工程师应该对软件各个方面都有广泛的接触面,对软件有深刻的洞察力,这种广而深的见识将让我们开发出更加高效率地开发应用。

我们周遭的人对全栈的描述往往是“我熟悉C/C++,java;swift,Ruby都会一点,还能开发IOS、Android、Windows应用,Web前端后端都做过。用过这些框架:……”

全栈不仅是会开发那么简单
全栈元素周期表,来自[xebialabs](https://xebialabs.com/periodic-table-of-devops-tools/#rd)

是的,在没有接触ThoughtWorks之前,我对全栈的定义就是这样的,什么语言都“会”,至少写过,各个平台上的开发都有经验。在这种定义下,我会略自负地讲自己算是一个全栈工程师吧。甚至,哈哈,除了上面讲的这些,我还开发过硬件平台上的软件(Arduino),自己用PS为自己的Android客户端设计过界面、图标,鼓捣过图标字体。是呀,想想这就骄傲,突然发现自己会那么东西。(当然了,理性地讲,其实自己心知肚明也就是“会一点”。)

窃认为我本人是一个对生活比较有想法的人,当我发现生活中有一些可以用软件来解决问题的时候,我喜欢自己开发出软件来解决:比如 我曾因为看到大学请假不方便,然后开发出给学生、辅导员、任课老师使用的请假APP,这个最后作为我Android开发实践课的大作业作品,老师打了100分;由于学校会经常让学生签到,我和几个同学利用微信公众号首先让学生在微信上签到并且获取他们的地理位置;由于在火车上无聊,我和几个同学做出一个在火车上搭建局域网然后借助我们的系统让乘客在火车上点餐、看电影、看火车沿途风景直播、到站提醒的应用……。在这个过程中,我得到很大的满足感和成就感,也学会了更多的软件技术,似乎离“全栈”更近了一步。

产品不仅是有想法就去干,而是持之以恒的打磨,它许多软件开发的多个角色地合力完成

暑假在腾讯实习的两个月,学习到的技术实际上是其次的;甚至因为实习颠覆了之前对BAT神一样存在的看法。他们的代码质量的确很高,但是并不是不食人间烟火,他们也会写Hard code,也会满百度、谷歌地贴代码。实习中让我看到的更多的是,一个好的互联网企业善于让多个角色之间进行良好的互动,它有一个成熟地为开发代码而做的系统;与我们在学校里不同的是,一个来自与产品和测试的需求、Bug工单流传到开发有一个完善严格的流程。

我做过的许多东西,实际很多都没有投入使用,仅仅是自己的自娱自乐,一个软件产品真正投入大规模使用,需要大量人力去做产品、运营。然后,我热爱开发,但是觉得产品、运营是个麻烦事。

入坑越久,你以为越渊博,实际上不自知视野变小了

校招,加入了我一个很喜欢的公司:ThoughtWorks(TW),TW是一个崇尚分享的公司,她期望我们把我们自己的想法用文章的形式表达出来。在周末时间,公司安排了职前培训,其中有一项任务是让我们在简书上写我们的学习过程、分享心得感受。同时公司的培训团队(“思沃大讲堂”)还会定期统计我们的文章,统计方式是做了一个爬虫抓取简书上的文章信息然后汇总输出报告。

当时,我正在学习Ruby网络请求的知识,看见每周一次发来的文章统计报告,我就萌生了做一个Ruby爬虫的想法。做出来以后我输出了一篇文章到简书,负责TW培训的*大哥(下称“总理”)看到以后,便决定让我的代码来做帮助同学们统计文章的工作,之后让我专门成立了一个小团队:思沃大讲堂爬虫项目组
我最初想成立这个项目组的目的,帮我们统计文章只是其一,更重要的是我想通过这个项目带动自己的Ruby学习进程。而总理的目的则是,希望学习项目开发的过程,让更多的人参与、合作。

到今天,几个月过去了,虽然爬虫组虽然基本能定期给参加思沃大讲堂的同学们发送一份统计报告,但是远远没有达到初衷。个人的出发点,本来想把报告做的更漂亮一点,页面中加入一些图片、报表等直观的视觉效果,加入文章排行提高同学们的活跃度,通过简单的算法实现好文章、优秀作者的推荐,找出最贴心的小buddy等等。从这些我想达到的初衷讲,这个项目显然失败了,而失败的原因,也正是总理 想要我们通过这一项目培养的项目开发、交流合作等方面的能力不足。

这个项目中,作为项目发起人,我最早为项目勾画了一个蓝图,搭建起项目的框架。一个在自己看起来很简单的一个需求点,对于自己看来实现起来也十分简单,但是传达给项目成员并实施却十分困难;首先,对于项目发起人,可能会根据自己的一些经验提出一些需求点,虽然这些需求在提出时就经过自己的大脑过滤是可实现的,但是对于没有相关经验的其它团队成员来说,他们认为的可不一定有那么简单。作为作为软件工程科班出身的学生,在我们“稚嫩”的认识中,软件的世界里似乎只有程序员这一个角色,当然“只有”这个词说的太偏执,诚然我还知道产品、测试、运营、运维等角色,但是长期囿于学校里小型项目的学生,往往长期忽略了产品甚至测试的重要性,产品,提需求的是我们;测试,我们写代码的自己测,不重要的地方就省掉吧;运维,随便搭个服务器呗。我们把软件开发的绝大部分重心放在开发上面,做软件就是开发,这一意识的植入,将会导致深重的开发本位思想,或者做事情的都站在开发的角度。比如作为一个项目发起人,我负责这个项目要实现什么样的功能,带着开发思维,是这样提“工单”的:

实现数据库中插入和更新文章信息(封装成一个方法),用于以后在爬虫抓取文章信息后直接调用

甚至我还会写明大家使用Sqlite3数据库。这样的工单开发思维就比较重了,作为项目发起人、作为产品、作为BA(业务分析),这样的单子就严重越权了,我们的职责应该是作为一个角色,要达到什么效果,这样做有什么价值(As a role,I want to …, so that …),具体怎么做应该交给开发,而不是用什么技术都要规划好。当总理指出我的错误,我却依旧带着“开发”的思维来规划项目时,我想我“入坑”依旧了。

或许,对于一个个人项目,我们可能有非常清晰的意图知道自己接下来做什么,然而,做一个较大的项目始终依托团队来完成,作为“世界上最复杂的逻辑实体”,软件是越来越难被一个人完成的。

我所看到“市面”上的“软件工程师”,坦诚地讲,往往等同于“码农”,或者通俗地讲就是“写代码的”。写代码,码农,从“软件工程”的学科定义来讲,并不能算的上是软件工程师的,更谈不上全栈软件工程师。作为一名“科班出身”的“软件工程”专业的学生,教科书上的定义翻译成通俗点的话是这样的:用工程化的方法来开发软件

而我想,作为工程,应该是怎样规划“施工”,怎样管理团队,怎样让工程更加高效、有序地进行,而这正是软件工程师区别于“写代码的”之本质所在。而全栈,也不仅仅是局限于开发技术上的全栈,而是包括业务分析、项目管理等等软件工程应用上的全栈。

上一篇:React Native中添加Base64支持


下一篇:Ubuntu 18.04 开启 root 账号并允许远程连接