其他項目分享(15):學電腦的過程

抽出一篇,寫下自己和電腦的緣份。和怎樣學了各式技術。
電腦陪了自己 40 年有多,比起自己所有親人和家人都來得久。有時我會引用足球小將的典故講笑:電腦係我的朋友。

~ 最初的起頭:童年 ~

最近是幾歲時,在外婆家玩遊戲機開始。那些青蛙過河、太空侵略者、馬戲班等等經典遊戲機的年代。
之後就是任天堂,Zelda 和 Mario 的早期年代。建立了興趣,就會留意電子產品,甚麼有關電腦的都想看。那些年雜誌上也有售賣電腦的廣告。
接觸能編碼的電腦,大約是小二小三在別人家中玩過。小三那年樓上有個大哥哥,家中有部 Apple II。大軟盤、舊搖桿那種。多少人知道,以前舊搖桿的設計:搖桿在右邊,按鍵是在左邊的。

我整個小學都是玩遊戲機。而每年暑假都會上些興趣班。小五小六那年有機會去了學電腦。Dos + GWBasic,大約 4-6 課的課程;明愛中心,80286、綠螢幕的電腦、20/40 MB HDD、 5.25 /3.5 寸軟盤。電腦室總有種味道。在終端機上打甚麼都要等。而且電腦還有個 turbo 鍵,旁邊有個數字。

這階段新增掌握的電腦語言和技術
Dos, GWBasic, QBasic
普通電腦技術,打字/鍵盤操作

~ 起飛:少年 ~

因為學了 Dos + GWBasic,開始會再學其他。當年母親喜歡看工聯會課程,我在初中去了學 Pascal,和倉頡中文輸入法。VB、C/C++。家中買了部很貴的 486DX/2。然後我就越來越過著玩電腦的生活。

那些年有傳統記憶體 640K 要用到盡的限制。而很多人都是改 config.sys 來加強記憶體。初中那時就學了這些技巧。也學到一些怎樣扭設定、扭 exe、扭鍵盤輸入;或掃描記憶體、修改動態記憶;之類的技巧。這些現在都歸類入 pentesting 的技術,那些年一併當做軟技能甚麼都學。自學了 lotus 1-2-3(excel 前身)、dbase(資料庫前身)和 foxpro。中四五那些年,迷上了第一隻稱得上沉迷的遊戲:master of orion 和 xcom。第一次明白心流下時間可以這樣快。也因為 master of orion 而開始研究設計遊戲。

第一次用電腦工作,應該是中五的暑期工。本來只是做下辦公室文職。當時機構要大量發信件,就請我這類暑期工幫手。本來只是貼下郵票之類。但列印出問題,同事又不懂操作。我一個中學生便去開那個 dbase 2 的舊程序來看。幫他們修改下設計、列印之類。

到預科,幫中學出校刊、文學刊物之類。一人扛起了整個刊物的工作。大量的中文輸入、word 排版、插圖、列印,拿去印刷。

但精采的還是編程。中五中六那些年已是開始自己寫遊戲。開始對 VB、VC++ 有興趣。用 VB 寫遊戲是不難的;我寫過些 RPG 和賭博遊戲。但 VC++ 涉及 directX 和 activeX,com, com+ 之類旳深奧技術,就使我開始感到電腦世界的浩瀚。開始明白個世界很大。

還有就是 modem,和 TCP/IP。除了玩 BBS 和學一些更底層、更深奧的技能,例如 ASM 和反編譯之類。還有就是研究怎樣將電腦連起來組成網絡。這些都是預科的那些年。還有中五左右那些年開始流行互聯網,自己也開始接觸網頁;還包括 CGI, perl, html, vbscript, javascript, css, php, asp, jsp 之類。也開始接觸 java。

這階段新增掌握的電腦語言和技術
Pascal, C/C++, VB, directX, VC++, activeX, COM/COM+/DCOM, DOM, html, vbscript, jscript, javascript, css, php, asp, jsp, java, dbase 2/3/4, lotus, asm, delphi, action script / flash
TCP/IP, win 3.1, win95/9/98, unix, access / database, networking, client-server model, 倉頡/速成, word/ppt/excel/office, compiler architectures, compile/decompile/disassembler

~ 職涯選擇 ~

少年時一路走來,未中學畢業都已學了廿個電腦語言。到預科後,選人生方向時,都沒有先選電腦。自己那些年跟著預科課程,有兩張簿記證書。本來大專學習是先揀會計。但電腦也很有興趣。本來是想日間讀會計,晚間自修電腦。但忘了是誰不太贊成,建誐我不如只揀一樣。於是在轉科的最後一天都還是揀了電腦。

大專的三年,是很輕鬆的渡過。想像到,上課都是在學些中學階段自修學過的東西,只能說補充番個正統訓練而已。甚麼 C/C++、java、data structure and algoritm (俗稱 DSA) 之類,同學們覺得深奧難明的東西,我差不多都可以幫埋同學做埋功課。我的 Final year project 是個 C++ + OpenGL + 3D animation + networked 的 MMO 遊戲。拿了個 A,當年畢業展覽,放在門口當眼處。那些年是不覺得開心的,因為知道外面世界太大,太多強人了。

來源是因為讀書之餘,都參加些業界活動。microsoft 在 2000 來香港宣傳 dot net,都去看。甚麼 xml, soap, dtd 之類,是現在 restful 之類的 API architecture 的前身。還有遊戲業界認識了橙、edwin、steven 他們。他們有幾個和我一樣都是中學階段已掌握了大量深奧電腦技術,出來傾計都是討論 vi, ASM, linux command。想像下,那是 98/99 的九十年代。我也是這些階段接觸更多的 pentester、pwn-er 技術。那些年 pentester 是要看很多 header、網絡制式;因為連 packet、header 都改到。現在保安加強了,pentester 的訓練很少談改 packet 和 header。

大專那幾年都是一直做 part-time 和 freelance。例如幫公司拉線;寫 VBA 程序;寫 RS232 serial port 的低層代碼。

這些年開始越走越專業。對 java, J2EE, dot net, foxpro, cobol 那些工作上會用到的技術都收納。中學階段紛雜的學了的技術,到大專階段正式有個整理。這階段為方便找工作,也考取了 CCNA 和 SCJP (現在應是 OCP)。

這階段新增掌握的電腦語言和技術
foxpro, vfoxpro, cobol, xml, soap, dtd, openGL, j2EE, javabeans, EJB, asp.net, c#.net, codewarrior, embeded C, oracle, sqlserver, sqlite, vba, sql, shell script, PL/SQL, struts, spring, hibernate
solaris, red hat, linux, pentester, pwn, CCNA. a formal computer science training.

~ 初職 ~

開始進入工作。就開始建立專業技能。中學階段我大約掌握到廿個電腦語言左右。大專大約掌握到 40 個左右。初職就是較專心研究。為免行文過長,只寫技術。30 歲前,修完了 bachelor 和 1st master。因為學術研究,能接觸到些很古老的語言。

這階段也開始進入中層,接觸管理學,和項目管理。明白商業運作、辦公室運作、營運管理等等。所以碩士時選修了管理。也考取了 PMP, SCWCD。

這階段新增掌握的電腦語言和技術
j2me, mysql, lisp, prolog, fortran, postgresql, ada, jquery, symbian C++
data mining, machine learning / AI, PMP, SCWCD, macOS, VR/AR

~ 30 歲後 ~

30 歲後漸入高層。也在這時開始流行 iphone & android。於是就是大量 mobile app 和 game dev。手機和遊戲是個大量技術的世界。也是這階段開始接觸雲服務,例如 AWS。

這階段新增掌握的電腦語言和技術
obj-C, swift 2/3/4, android java, android kotlin, json, dart, cocos2D/X, titanium, ionic, nodejs, reactnative, typescript, reactjs, vuejs, angularjs, R, unity JS/C#/C++, ruby / on rails, python / django, lua, erlang, springboot
macOS, iOS, android, xcode, AWS (S3, SC2, RDS, elastic cache, codecommit, cloud formation, cloudwatch, cloudtrail..), git, svn, redis, memcached, mongodb, dynamoDB

~ 35 歲後到現在 ~

過了 30-35 手機、手遊、雲端那些大量收納技術的日子,之後技術方向越趨穩定。開始沒有多元的技術,化繁為簡,集中在幾個主要技術,夠用就夠。

有些主要的研究,例如 containers, devops / CI/CD, 自動化流程。之後也研究 pentester / pwn-er 技術,考取了 OSCE3。也是這階段陸續取得了三個主要雲端的專業架構師認證。還有 AI。這些都是大量收納新科技的契機。

雖然這篇看來很多。應該還有很多未能盡錄,因為有些各式的研究,例如 WAF, IDS/IPS 之類,很多微細的知識和技能,都很難一一細錄。

這階段新增掌握的電腦語言和技術
go, rust, k8s, docker, kafka, scratch, appium, selenium, cucumber, scala, powershell script, solidity, blueprint, protobuf, pytorch, numpy, pandas, tensorflow, keras, godot / gdscript, etc..
jenkins, GCP, Azure, blockchain, nosql, devops, pentester / pwn-er, OSCE3, AI, sonarqube, jmeter, postman, etc..

回顧,會覺得通常大量收納語言會有幾個契機:

  1. 入門階段,甚麼都學
  2. desktop app
  3. gamedev
  4. database
  5. mobile app
  6. client-server
  7. cache / memcached / redis
  8. clouds
  9. architectures / nosql / pub-sub
  10. API architecture / gateways
  11. IoT
  12. devops
  13. blockchain
  14. AI
  15. pentester