不知不觉进入纯软这个业界也已经十几年,所以对于在 Soft_Job 版上常常看
到的一些议题也有了自己的想法,想说趁这个机会整理一下自己的看法,和大
家分享一下。这篇主要会先分享一下我对于读大学的看法。
要先说的是,我觉得我自己就是某种程度上的幸存者,所以这边的经验也只是
我自己的经验,但也是我最真实的想法,以及一些我实际上遇到的经历。
先交代一下背景,我自己会进入这行,大概是从小学时候就有的想法,那个时
候家里有台电脑,每天回家都在玩那台电脑,所以那个时候开始就想着长大要
靠这行吃饭,不过当然只是很粗浅的一种概念,那个时候主要还是放学就在打
电动,并没有什么真的实际的作为。
到高中分组的时候,因为逃避自己对于数学没兴趣这件事,以及曾经有一度想
唸中文系或历史系,所以选了文组。但后来还是靠申请入学上了国立暨南国际
大学资管系,在板上我想应该是会被归在后段国立大学?反正非四大四中,而
且是文组的资管系,并且最后直升该校的资管硕班。
不过这样的我,最终现在还是混到了如大家说的,在 150 左右上下挣扎的
WEB 仔,不过是个生活与工作很平衡,觉得可以做自己喜欢的事情还有薪水可
以领很开心的 WEB 仔。
在板上经常会出现的一个议题就是要不要去补大学学历。我想这个大家都很清
楚,一种看法是这行确实你可以不用相关科系也可以来做,这绝对是可行的,
也一堆人靠这种方式转行;另一种看法则是相关科系毕业是进入这行的最快的
方式。
这两种说法我认为都是对的,这行的进入门槛真的很低,只要有心,真的是一
台电脑加上毅力你就有机会进入这行。但另一方面,你有文凭再加上不要太混,
入场劵基本就到手了。
而常常看到的另一个观点,是对于大学科目的质疑,认为大学教的东西都很过
时,出来业界还是要重新学习。
关于这点其实我反而有比较不同的看法,我认为大学教的科目他的价值,正在
于他的“过时”。我认为严格来说,他应该不叫“过时”,而叫做“基础知识
架构”。
举个实际的例子来讲,前后端的 Framework 这十年来都换了几轮了?但网络
的基础架构还是没有变,SQL 的主要核心概念还是没有变。从 Web Browser
上输入网址到显示内容,基本上还是一样的流程。
更别说再更基础的计算机架构、算法和 OS 里的多执行绪等等的概念了,这
些概念性的东西到现在,其实到现在都还是很实际的东西。反而是很多那个
时候我学的 Framework 或各个软件的版本,现在早都不知道被什么取代了。
但电脑程式还是电脑程式,在抽象上基本还是 Von Neumann 架构,底层还是针
对内存中资料的各种操作,各种程式设计典范 (Procedure / Object-oriented /
Functional) 的精神还是长那样。而这东西是我天天在用的,真的是天天在用,
因为这是我对自己写的每一行程式码的理解。而我自己的经验上,遇到过不少
不知道程式为什么会坏,为什么是那样的行为的,其实就是没搞懂程式执行的时
候,抽象上内存里的内容是什么东西而已。
至于这些东西有没有用,我想应该可以用实际的例子来说明。现在做前后端,基
本上算法都是函式库包好好,很少有机会自己写我想这应该是共识了。这十年
几年下来,我真的在工作上实作过,和算法勾得上边的东西,大概也就只有树
的 DFS 或 BFS 而已。
那就代表大学教得算法没有用吗?这么讲吧,我曾经在某个线上的 Java 专案
看过这样神奇的程式码,这个专案主要是一个批次的机制,然后会需要依照顺序,
处理档案系统上的某些资料夹,对应到某个 ID 并进行处理,注意他是有顺序性
的,而且同一批次中 ID 是会重复的。
结果呢,写这个专案的人用了一个 Java 里的 HashMap 来存要处理的 ID 和档案
系统的资料夹的对应……我看到的时候整个黑人问号。HashMap 最基本的特性不就
是一个 KEY 只会对应到一个 VALUE,而且是无序的吗?也就是说,根本就有档案
没有被处理到。我很难想像这是一个有认真上过非常基础的资料结构与算法的人
会写出的程式。
另一个我印象深刻的例子,就是我曾在以前某间公司遇过后端工程师部署程式上去
网页服务器后,发现从自己的机器无法连上网页时 (Connection Refused),却不知
道如何排查问题,重点是他是有 access 服务器的权限的。
但实际上,如果有一点点对于 OS 以及网页似服器的运作原理的理解,应该会很明
确的第一步就去查网页服务器的 process 有没有起来了。
说穿了,我觉得大学最主要的价值,就是在于“有人帮你整理好了整个知识体系,
并帮你安排进度”,而对我而言,从我工作上的经验,我真的认为大学的学习的科
目帮助我很多。特别是工作上要学习完全没接触过的新的东西的时候,因为有这些
基础,所以可以很容易抓到重点,可以透过基础的知识来借境并且理解。
另一个我觉得大学很有用的地方,是他可以让你探索对于不同的领域的兴趣。
因为我自己 Linux Kernel / Andorid BSP / Android APP / Library Design / Web
前后端 / Desktop Application 都碰过一点,所以感觉满深刻的。就是虽然都是纯
软,但每个领域的成就感、有趣的地方、烦人的地方都不太一样,而大学可以让你在
几乎没有额外的成本之下探索自己有兴趣的领域,我觉得这是很棒的一点。
最后我列一下我认为不论是走哪个领域,不管是资工还是资管,在大学都一定要学
好,而且工作上我觉得非常实用(以及面试时也常常考)的几个科目:
1. 程式设计 / 计算机组织与架构
这两个通常会是两门不同的课,但其实是一体的,这两门课是在帮你建立完整的
对于你写的程式的心智模型。
2. 资料结构与算法
不是叫你一定要像刷题达人一样可以看到题目就实作出解法,但对于各种资料结
构和算法的基本特性还是要有个概念。就算人家函式库都帮你包得好好的,你
也总是要知道在什么场合下适合用什么样的资料结构或算法对吧?
3. 关联式数据库概论
这个不用说了吧……即便是现在一堆 Non-SQL DB,但很多时候他们也都是以和
SQL 做比较的,以及在 CAP 定理中他们想要解决哪几个问题以及放弃哪个之类
的。
4. 网络通讯概论
我认为对于各个常用的 Protocl 多少要有些了解,特别是现在几乎各个领域都
离不开网络了,特别是做 WEB 的,HTTP 怎么一回事,和浏览器上输入网址后到
画面显示出来之间发生了什么事,总是要有基本的了解吧。
5. 作业系统
现在愈来愈多 Multi-thread 的程式了,各种经典的 race condition / deadlock
问题等等,这些东西都是真实世界会发生的。
当然不是说我这边没列出来的科目就不重要,而是在十几年做为软件工程师的职崖
中,我认为基本上是常常都会接触到,而且从来没有让我觉得“我在大学学到的知
识是过时并且无用”的东西。
当然这个领域一直在翻新,CPU 里的真实工作情境、指令集可能也早已和我通初学
的计算机组织与架构差异很大,但抽象概念性的东西我认为并没有真的差太多。
关于大学里学的科目,大概是这些想法。我是认为,如果已经确定要走软件这条路,
有机会就去唸大学,基础的科目好好掌握,然后尽可能接触多一点各式各样不同的
领域找找看自己的兴趣在哪。
至于研究所,老实说当年我并没有很强继续往上唸的想法,只是顺势就读上去了。
虽然课上得很开心(我喜欢上课),但论文写得很痛苦。
基本上研究所我是混毕业的,对我来说研究所的价值真的就是那纸文凭而已,虽然
除了我后来有在中研院一段时间是靠那张文凭核薪外,我也不知道那张纸他还有什
么其他的价值。
下一篇,应该会讲一下我真的进到这行后,一路以来对于生活与工作的平衡的一些
心路历程。