我是怎幺靠自学成为工程师的:懂原理比应用更重要

267℃ 116评论
我是怎幺靠自学成为工程师的:懂原理比应用更重要

好几个月前我就开始想写部落格了,就像其他人一样,我迫不及待地希望能为世界贡献,所以我申请了一个网域,安装了最新版的 WordPress,然后开始跟 CSS 奋斗,想把它改造成最适合我的风格。

等到我终于準备好,面对一张挡在我和世界间的空白页面和闪烁的游标,却什幺都想不到。我在脑袋里按了 F5 重新整理,接着又狂按 Ctrl + F5 ,检查了一遍脑袋的连线,没有问题,但还是什幺都没出现。最后我按了 F12 开启开发者工具,发现那里也一片空白,只看到状态代码:HTTP 204 —— 无内容。

这并不是因为我懂得太少,或是我找不到有趣的例子,想要的话我也是可以信手捻来一些教学文的,我只是不知道该从哪里开始。

我知道自己想写一些问题的实际解法或不同观点,同时给程式新手和老手看,但该讨论什幺样的问题呢?比较内建阵列函式和迴圈的的各项指标,看看该求效率还是易读?简介 MVC、写 jQuery 外挂教学、列出常用的 SQL 指令,或是单纯谈论应用程式建构的心得文?想到这里,我的脑袋就开始进入无限迴圈,所以我只好强制终止思考,把写作这件事搁在一边,回头去处理手边的程式码。直到两个月前,Medium 这个平台吸引了我的注意,才决定要从这里开始写作。

我是怎幺靠自学成为工程师的:懂原理比应用更重要
(
骗子症候群:我根本没有资格当工程师

然后我看到了 Jeff Smith 写的一篇文章,题目是「认识并解决 骗子症候群」,那篇文章提到,维基百科对骗子症候群的定义是:

Jeff 对此的解释则是:

剎那间我发现自己好像有骗子症候群,这些症状非常眼熟。我之前从来没听过骗子症候群,说得更精确一点,我根本不知道除了我和办公室角落那个超级内向的女生以外,世界上还有其他人也有这种感受。

到了这里,先容我自我介绍一下,我在目前的公司已经待了一年,你可以称我是领导、资深,或者主任工程师,我前一份工作做了四年,在更早之前,出于热情和不想自己处理麻烦事的懒惰,我自学了程式。幸运的是,也有很多人跟我有相同困扰,很多使用者踊跃订阅我写的程式,让我得到投资并成立了一家公司。

经过几年,我在一个专业的小圈子里面成了德高望重的成员,里面的人都在自己的领域有相当的专业和权威,我透过这个圈子也经手了许多工作,其中很多根本是不可能的任务。我们也会互相帮忙解决问题或交换意见,很多新手工程师异常地尊敬我的程式码,这让我有点不习惯,毕竟我才刚开始有自己是专业工程师的自觉,我也不习惯从学生变成老师。这一切都提醒着我,不久之前自己还什幺都不懂。

我通常几分钟之内就能解决漏洞,我可以一眼看出哪里需要修改,有时候我写出来的解既简单又优雅,让我可以佩服自己好几天。我知道自己很聪明,朋友也常在酒过三巡后开始疯狂夸奖我:

我通常会回答:

这全都是我的真心话,我并不是开拓了一片未知的土地,我只是跟着地图走,你觉得我聪明,可能是因为这份地图是用函数写的,看起来很难懂,但它终究是一份地图,我看着这份地图,知道何时该抄近路、何时该横越河流,让这趟旅程更快、品质更好,但我还是远远比不上发现公园的那个人。我连写了一段还不错的程式都不敢居功,把功劳都归给了设计这套语言的人。直到现在我才明白,就算这套语言有着完美的逻辑设计,但一台超跑还是需要厉害的车手才能发挥潜力。也许是因为我自学,不清楚我的能力到了哪里,也许是因为骗子症候群,也许我觉得不正规的自学,感觉像是作弊一样。但透过这份自白,我认为相当适合作为一系列工程师心得的起点,了解从何处开始你就成为了真正的工程师。

你可能有注意到,我尽量避免使用「开发者」这个词,因为我个人觉得这个词太模糊了,常常产生误解。另外,很多文章都在探讨有资讯工程学位和自学的工程师孰优孰劣,但我并不打算在这里谈论这个话题,因为对我而言,程式之美便是你永远无法习得全部的知识,我们生存的世界、使用的工具和準则都经常在变动演进。而我认为这可能就是骗子症候群的成因之一。

最终你得抉择,究竟是想要样样通样样鬆,把写程式当作当作兴趣,在工作上顶多就是能帮你管专案或开规格;或者是你想要专精某样领域,时时更新该领域的最新应用,直到你专精的领域被淘汰,最后工作内容只剩下维护旧程式码。

我是怎幺靠自学成为工程师的:懂原理比应用更重要
(
框架泡沫扼杀了工程师幼苗

所以工程师到底是什幺?工程师的定义当然就是:

但会煮饭不一定就是主厨,写了这篇文也不会让我变作家。一开始你就像「薛丁格的工程师」,在成为工程师之前,你是也不是工程师。

我觉得现在整个程式界正处于一种「框架泡沫」中,许多的资源和精力都聚焦在开源和顶尖的框架上,而专精一项程式语言的使用及讨论就成了没人关注的大盲点。幸好我自学程式的年代,框架还没有如此氾滥,我也不会看到这样的叙述:

如果我当时看到前 5 篇搜寻结果都是这样的内容,我大概就会早早放弃,当个无业游民或是躺在沙发上寻找心灵启发。

先别急着攻击我,其实我很爱框架,因为它们可以让小程式也能在短时间内拥有大量功能,不用重複 debug 和从头架构,也不用检查一堆基本问题。框架帮我们省去大把时间和成本,降低架设网站和应用程式的门槛,让更多人能将自己的产品分享给世界,达到最有效率的成长和创新。框架也能让初至中级的工程师开发出实用、架构严谨又整齐的程式,你才不会在假日接到求救电话,说新手工程师把你先前建的稳定架构破坏殆尽。

虽然降低门槛大概是框架最大的优点,却也是最大的缺点,我觉得它会扼杀工程师的幼苗。我认为在没有全盘了解以前,就不该使用那个框架,你应该要有能力重写或至少重製这个框架,或者扩充、改造,甚至最重要的是 debug。框架和程式库对正在学写程式的人来说可能非常危险,因为你会把他们和基础程式语言搞混。jQuery 便是常见的例子,我见过无数的人学会 jQuery 就以为自己懂 JavaScript,我自己偶尔也会把 jQuery 和 Vanilla JavaScript 弄混,都是因为我在熟悉 JavaScript 前先接触了 jQuery。

我花了好几年改掉这个毛病,因为我在学程式语言的语法前,先学了框架的语法,更因为我习惯了 jQuery 的功能,像是 DOM 的操作和动画之类,而且丢脸的是,我以前也会大言不惭地说「有了 jQuery,谁还需要 JavaScript 啊?」

那个时候我应该要专心研究语法、设计模式,最重要的是要去理解物件是 JavaScript 的灵魂。我应该要学习製作物件原型,去充实重点观念,像是「用物件导向的语言写程式,不代表你就是用物件导向的方法写程式,」等等。结果我都浪费时间在把按钮弄得一团乱,做一些累赘的隐藏、滑动、弹出、旋转动画,把网页搞得很花俏却一点也不实用。

我是怎幺靠自学成为工程师的:懂原理比应用更重要
(
我的工程师之路始于一套会员卡系统

我一直都对电脑很在行,8 岁的时候我就已经是 Windows 的进阶使用者了,我也知道自己有一天一定会开始写程式,不过命运的捉弄让我很晚才开始写程式,当时我甚至有好几年过着没有电脑的生活,而且那时候南非这里网路不普及,没多少人听过 Google,而我至今还没在图书馆和书店看过像样的程式相关书籍。

2008 年的时候我终于有动力和机会学程式了,当时我在一家超市当经理,那间超市在本地算大,不过也只比得上美国 Walmart 或 Target 商店的一个摊位而已。当时店内有 18 个柜台,而我是最年轻的经理,所以麻烦事自然都落到我身上。为了一项老年人优待方案,结帐时我得用一只钥匙打开键盘,登入电脑,经过一堆複杂又不人性的操作,才能顺利使用这项折扣,熟练之后我只要 30 秒就能完成以上流程。

我们店附近有 3 间养老院,所以很多老人会光顾,而我时常得在折扣柜檯和收银柜台间跑上跑下。当时我压力很大,每天工作的内容就是在楼下结帐、陪熟客长辈逛超市,期间又要不断冲到楼上兑换折扣,我觉得自己要不是年纪轻轻就提早退休,不然就是哪天在店里崩溃,还被拍下来上传 YouTube。

然后我就想到了,应该要在店里安装一台自动折扣机,我们发优惠卡给这些退休老人,他们只要轻轻感应一下,就能自动折扣。于是我马上 Google 了「如何写程式」,一个礼拜后就做出了基本的程式,3 个月后店里就成功诞生了一套老人优待系统。优待卡的消息流传得很快,店里的生意变得很好,年长的客人多到我们得另外买三台轮椅,让他们行动不便或逛得太累的时候可以用。不久之后我又加入了一般会员卡功能,并将这套系统发展成了南非最早的卖场会员卡系统之一。

到这个阶段,不会写程式的人会将我视为程式达人,但儘管我确实可以写出一套程式,却还称不上工程师。我的系统简陋又粗糙,是我从网上一知半解地参考了许多语法段落拼凑而成的。我基本上不知道自己在做什幺,而且也不知道背后的原理,我选择不去质疑背后的问题,就像那句俗话一样:「如果它没坏,就不要修它。」

我是怎幺靠自学成为工程师的:懂原理比应用更重要
(
当写程式变成正职:边做边建立观念

没过多久我就找到了投资人,接着当上了工程师的职位,但我竟然不是去做一些 Visual Basic 相关应用,而是被派去做网页。我的概念作品之后虽然还是经过别人修改,但也意外发现我拙劣的 HTML 和所见即所得软体的功力,和驻站的 ASP Classic 工程师比起来不算太差。当时 Google 真的救了我一命,两週内我就熟悉了 HTML 和 CSS,再过了两週我已经会了基本的 JavaScript,开始接触 jQuery ,而且学会了 CSS box method。

一年后我已经会了 SQL、ASP Classic而且可以做出有管理员登入介面的,还不错的网站。我开始用闲暇时间写自己想要的程式、做一些教学,我开始用 canvas 做一些小游戏,然后终于能够不靠 Google 写出程式或网站的 80% 。大约从此刻开始,我认为自己总算是一个工程师了,不是因为我的技术有多强,我那时连中等程度都没有,而是因为我某种程度上可以了解编写的概念和潜力。

别误会了,我不是设计模式大师,我当时几乎不知道它们的存在,但我就是在没听过「设计模式」的状况下,做了一堆类似的东西。我会在脑袋里面有个概念,可以拟定程式该怎幺写,而不用真正打出一堆指令,然后再东拼西凑让它可以勉强运作。我不只会宣告阵列,我还知道阵列是什幺、可以拿来干嘛、要用什幺方法、这些方法有什幺效果。一旦你透过像这样的方式理解背后的观念,学新的程式语言就容易了 100 倍,因为你知道你该做些什幺,也知道你可以用它来做什幺。

搞定这些,剩下的就是一些语言习惯、输入、输出和语法了。这代表你能超越这套程式语言,不再受限,你可以建构稳定的应用程式,还有优秀的整体逻辑和设计,这些都是你在语言语法里面找不到,而要透过一些诀窍、追求完美的心态,或者花时间获得经验才能学到的。这些就是我所认为,凌驾于语言或框架之上的技能,也是真正的工程师必须具备的条件。

欢迎加入「Inside」Line 官方帐号,关注最新创业、科技、网路、工作讯息
我是怎幺靠自学成为工程师的:懂原理比应用更重要
上一篇:           下一篇: