我用 1 個 2 手計算器換了 3 臺 MacBook(上)

語言: CN / TW / HK

0x0. 網名「野生的碼農」的由來

在開始正文之前,先囉嗦兩句,在我的程式設計生涯中,沒受過什麼科班教育,憑著對計算只因的熱愛,「野路子」比較多。按照百度百科中對「野生」的解釋,我是一名「野生的碼農」:

野生,意思是動植物在野外自然生長而非經人工馴養或培植

我是在安醫大讀了3年多醫學後,覺得不是這塊料,轉頭自學了1年的計算機系課程後,跨考了中科大的計算機系(11系)研究生(學碩),運氣還行,一次就上岸了。中科大就不用介紹了,安醫大可能很多人不知道,只得強行蹭一波名人的熱度了:

安醫,許嵩的本科學校,我和他同屆;著名黑客 tk 教主也是安醫畢業的,他倆都在90週年校慶中被評為了優秀校友

當然,安醫校友中還有更傑出的,尤其是今年,可謂是家喻戶曉、如雷貫耳、炙手可熱、聞者落淚,點到為止,你懂的

3年多前,趁著在騰訊轉崗的間隙,我寫過一篇文章《醫學跨考計算機研究生10週年》,介紹了跨專業考研時的心路歷程以及我寫文章時的工作和生活狀態,打算持續更新讀研、工作時的一些趣事。然鵝,自那之後,工作更忙了,2019年底開始管理團隊。2020年初,那啥開始了,生活完全被打亂了。再也沒時間,沒心情寫東西了。

7月底,我結束了整整10年的北漂生活,回到了合肥上班,關於這個抉擇,感興趣的朋友可以看看這篇文章《鵝廠組長,北漂 10 年,有房有車,做了一個違背祖宗的決定》。相對而言,合肥的工作沒北京那麼忙,所以,從10月底開始,我又開始隨緣更新了。覺得文章有點意思的朋友,不妨點個關注,防止失聯。雖然現在有點空餘時間了,但更新速度不敢保證,跟老婆吵架的頻率大致成反比🐶

先說個最近錯過的發財機會,11月底,在海鮮市場發現了個奇葩的計算器,看上去就很厲害的樣子,69不包郵,入手了一臺。賣家發貨前,我隱約感覺這是個好東西,又追加購買了1臺,最後是兩臺150元包郵,這是我手裡的兩臺:

奇葩計算器

到手後,確實像我猜想的那樣,是Android系統,9.0版本。研究了1分鐘,開啟開發者模式,用adb安裝AIDA64,詳細配置:

全志 A50 CPU,32位,4核1.5GHz;1G RAM,8G ROM;5.4寸螢幕,1280*720 解析度

單聲道揚聲器,光線感測器,WiFi,藍芽,typec 介面,支援OTG,沒有 GPS

據網友拆機,有空餘記憶體和SD卡焊盤,但直接焊上同規格記憶體顆粒不識別,可能跟 MacBook 一樣,擴記憶體時需要同步改電阻

這麼多按鍵,用來玩模擬器遊戲應該不錯,然而NES.emuGBA.emu都識別不了按鍵,只有它自帶的計算器能識別。自己寫了個 demo,確實是收不到onKeyDown事件。把自帶計算器的 apk 拖出來,反編譯看看,居然是什麼tty,需要每個APP開啟串列埠dev/ttyS4監聽鍵盤輸入,而非 Android 系統標準的onKeyDown,淦!

直覺告訴我,這玩意肯定會火,這個造型的安卓機太罕見了,垃圾佬狂喜,學生黨摸魚神器。果不其然,就在我購買的同時,酷安大佬也發現了這貨,不到2天,賣家手裡的1000多臺就賣光了。現在漲到159了,還有網友願意加價100購買我手裡的,當然沒捨得出。

如果我當初直接把賣家手裡的機器都包圓了,每臺加價50出,保守能賺5個w,夠買臺心心念的本田NSS350了。可惜我膽子小,沒敢出手(其實是股票和基金虧麻了),不過也可能是好事,至少不會被網暴:

他惡意哄擡物價,靠計算器賺了一套房,這究竟是道德的淪喪,還是人性的扭曲?!

也正是這件事勾起了我對往事的回憶,決定寫點東西,聊聊我是如何在計算器的吸引下,走上了碼農之路,並順便用計算器換了幾臺 MacBook。大多發生在我讀書和工作初期,希望對讀者有所啟發。

宣告下,我不是標題黨,文中的所有事件都是真實發生過的,我對著打了骨折的工資條承諾:

本文內容,貴在真實,如有虛構,(工資)折上加折

0x1. 接近完美的 MacBook Air

9月底的時候,合肥日常氣溫還在30度以上,為了避免電腦散熱導致全球變暖,我斥巨資0.00013億,全款購買了一臺頂配 24GB 記憶體的 M2 款深空灰 MacBook Air。這臺機器除了螢幕小了點,音響效果垃圾外,其他地方堪稱完美了,重量輕,續航長,效能好。剛買完不久,就聽說明年春季要釋出15.5寸的 MBA,看來跟股票一樣,又沒把握好出手的時機。

這些年,花了不少錢購買蘋果產品,我不是果粉,只是覺得蘋果的生態不錯,用起來省心,質量也過得去,同價位找不到體驗更好的產品了。算下來,這是我購買的第3臺蘋果筆記本了,另外兩臺是2014年時購買的頂配港版15寸 MBP 和2015年時給老婆購買的丐版13寸 MBA,分別耗資 1.5w 和 0.6w。

但是,你敢信,這些 MacBook 竟然是用1臺價值10元的二手計算器換來的。計算器長下面這個樣子:

科學計算器

注意看,這個寶貝叫小帥,它是所有故事的起點,不過即使帥氣如小帥,也只能屈尊男二號,男一號當然是我了🐶。本文會按照時間順序,介紹小帥如何在我的英明帶領下,一路披荊斬棘,身價暴漲數千倍,從計算器逆襲成多臺 MacBook 的。

0x3. 如何用計算器換 MacBook

相信大家都看過「如何把大象裝進冰箱」的段子,如下圖所示分為3步:

把大象裝進冰箱

同理,用計算器換 MacBook 也是3步:

  1. 挑選 MacBook
  2. 物物交換
  3. 潤!

全文完,祝您幸福,可獄不可囚的新生活就在閻前了。哈哈哈哈,有沒有上當的趕腳?褲子都脫了,你就給我看這?

雖然上面只是個段子,但其實整體步驟是差不多的,只不過第2步需要補充億點點細節,請試試看:

算術入門

好了,不開玩笑了,因為實際的「物物交換」的過程非常坎坷,時間跨度長達12年,我會分成3篇文章來介紹,內容簡介:

  1. 大學前的懵懵懂懂 -- 不堪一擊
  2. 本科時的誤打誤撞 -- 初學乍練
  3. 讀研時的不務正業 -- 略知一二

每篇文章中,都會分享一些真實發生的小故事。不是為了水文章數量,擔心文章太長,讀者看了一半就跑路了😁

0x4. 人生的第一臺科學計算器

初二(2000年)左右,數學書上有了科學計算器的介紹,貌似是用來計算三角函式的,記不清了。因為我家是農村的,周圍買不到這種「高階」的科學計算器。於是,託同學幫我買一臺,印象中是18塊錢,他說直接買他的好了,沒用幾天,只要10塊錢,成交!於是,他擁有了10塊錢私房錢,我擁有了人生的第一臺科學計算器,就是本文開頭圖片的那款,帶時間顯示的。

那個年代,沒啥玩的東西,計算器也成了電子玩具之一。連蹲坑都拿在手上,閒著沒事我就一通亂按,看看能算出個啥。很快啊,我就熟練到了爐火純青的地步,對所有功能都瞭然於胸,包括階乘、隨機數、二進位制等。除了「->rθ」和「CPLX」,這是極座標、複數相關的,初中水平有限,不知道是做什麼用的。

因為熟悉,還用它搞過惡作劇,把同學的計算器改成16進位制,此時,只有「加減乘除」基本功能可用,sincos等函式都失效了。再輸入一些字母,即使重新開機也依然停留在16進位制,類似下面這種顯示:

16進位制

同學以為計算器壞了,找我賠,場面一度十分和諧😁

當然,作為計算器,它更多的時間還是用來計算的,雖然是因為數學課買的,但數學課幾乎沒有過,印象中計算過統計中的方差和線性迴歸。主要用途還是物理和化學,用來計算浮力、做功、分子量、方程式啥的,節約了很多無聊的人肉計算時間。

讓我感興趣的是,這貨是如何算的這麼快的,高斯雖然能口算 1\~100 的和,但他肯定口算不了 1\~69 的積。為什麼是69,而不是100?沒用的知識:

一般的科學計算器只能計算到69的階乘,因為69! = 1.711224510^98,70! = 1.197857210^100

而計算器使用科學計數法時,其指數部分最多顯示兩位數,所以,最大隻能計算69!

補充兩個當時發現的無聊的例子,只看結果的前幾位數字,很完美,但後面「跑偏」了:

a. 1234567890*8 = 9876543120

b. 1111111111/9 = 123456790.1

如同我們的人生一樣,並不會總是按照自己設想的路線圖發展的:①. 你可能多年以後才能獲得曾經夢寐以求的東西,像a中的2出現在了1之後 ②. 更有可能的是,你永遠也得不到想要的東西,就像b中的8一樣。我現在真的覺得,這些都是命,強求不得,要坦然接受生命中的不如意。

扯遠了,為了探尋科學的真理,中考後的一個夜黑風高的大白天,我舉起了39米的大刀,溫柔地劃開了它的胸膛,得到了若干電阻電容晶振以及一塊看不懂的電路板,電路板上有塊圓形的牛屎晶片。就這樣,我人生中的第一臺科學計算器走完了它光輝的一生,享年2歲。

0x5. 早逝的超級函式計算器

上高中後,又花20塊錢買了台山寨的夏普科學計算器,比之前那臺少了時間功能,其他功能一毛一樣。節省流量,圖片就不放了。

每次逛書店和城隍廟,都會去賣計算器的櫃檯轉轉,看看有沒有更高階的計算器。即使買不起,看著密密麻麻的按鍵,也是一種享受。遺憾的是,它們除了外觀略有不同,功能上和我手裡那臺沒有任何區別,實在是無趣。直到高三下學期的某天,午飯吃飽後,不想在教室裡吃狗糧,去城隍廟透透氣,意外發現了一款看上去就很高階的計算器,螢幕是點陣的,按鈕非常多,還能輸入26個英文字母,如下圖:

超級函式計算器

這貨的中文名字十分很霸氣,叫「超級函式計算器」,印在 A 面的外殼上,拍照時已經遺失。老闆娘開價80,我是學生,抹個零,8塊。你是畜生也不行,滾!最後貌似是38還是48買來的,簡單研究了下,相比我手裡那臺山寨夏普,這傢伙確實配得上「超級」的名頭。它內建了很多物理和化學的公式及常數,也可以自定義公式,輸入各變數的值,直接輸出公式的值。例如:E=mc^2,輸入 m 的取值後,會自動計算出 E,c 是內建的常量之一。

臨近高考,沒時間再研究其他更復雜的功能了,高考後,就把它給我妹了。然而,沒多久,它就被我妹摔駕崩了,享年1歲。上面的照片貌似是05年用同學的手機拍的,它那會已經薨了大半年了,相當於拍的是「屍體」了。我後來拆開看過,電路板很漂亮,裡面有好幾塊十分工整的方形牛屎晶片。抱歉,看不懂硬體,只能這麼蒼白的表達了。

因為它的早逝,一直沒能搞清楚它到底有哪些功能,我現在還時常在網上搜索這款機器,希望能能再買一臺。可惜一無所獲,可能是保有量極少吧,甚至連資料都找不到。罷了,隨緣吧,讓往事隨風。

0x6. 碼農之路的啟蒙老師

相信絕大多數程式設計師的啟蒙老師都是凡人,而我的程式設計啟蒙老師是位神仙 -- 文曲星:

文曲星 PC1000a

遺憾的是,啟蒙老師已經遺失在歲月的長河裡了,圖中的文曲星是我最近花了130大洋買的,還是比臺版文曲星「哈電族」更常罕見的港版。賣家可能是怕我到手刀,反覆叮囑我港版安裝程式會有亂碼,建議我買國行的CC800。我說亂碼無所謂,買回來回憶下青春,主要是為了情懷,能用就行,還讓賣家順便幫我裝了幾個程式。

高一,花400多買了臺支援數碼錄音的文曲星 PC1000,沒多久機器出問題了,換成了剛出不久的PC1000a,不支援數碼錄音,但外觀更小巧,配色更舒服,看上去就像是一臺迷你膝上型電腦。讓人費解的是,我用它玩了兩年多俄羅斯方塊,詞彙量居然沒有絲毫進步,足以證明文曲星並不能提高英語成績。

文曲星也自帶了很多計算器的功能,有科學計算公式計算統計計算等等,兩個沒用的知識:

文曲星能計算的最大階乘數是 3208! = 8.6168014*10^9856

文曲星能顯示的時間範圍是1932年1月1日 ~ 2031年12月31日

高三的某天,開啟文曲星準備算點什麼,不小心進入了「計算/換算」裡的GVBASIC,只有一個游標在閃動。雖然之前也進來過,但一直不知道是做什麼用的,所以每次都是立刻就退出來了。那天可能是無聊,本著來都來了的精神,亦或是大意了,沒有閃,我按下了「求助」按鈕,閱讀起了機器自帶的幫助,裡面有IFFORGOTOASCII等內容的介紹,隱約地感覺是程式設計相關的功能。

高一的微機課結束後,除了偶爾去網咖衝浪,就沒機會接觸到電腦了。而且微機課也只是教了點打字和微軟三件套等皮毛,最後一課時,微機老師簡單演示了Visual Basic程式設計,看上去很厲害的樣子,不過,我是真沒看懂他在搞毛。難道文曲星也能像電腦一樣程式設計?

當時,恰逢數學剛學完橢圓不久,發現幫助裡有個ELLIPSE的指令,可以用來畫橢圓,幫助內容如下:

ELLIPSE 畫橢圓

用法:

ELLIPSE X0,YO,A,B,FILL,TYPE

*FILL=1 填充

*FILL=0 不填充

*TYPE=1 畫橢圓

*TYPE=0 清橢圓

如:

]10 GRAPH

]30 ELLIPSE 80,40,60,30,1

把示例程式碼輸入文曲星後,按下RUN執行,立刻顯示了個實心的橢圓,嘗試把程式碼中的1改成0,橢圓就沒有填充了:

文曲星繪製橢圓

臥槽,好神奇,後來還嘗試了CIRCLE畫圓、LINE畫直線等內建指令,繪製出的圖形完美符合數學中的相關定義。靠著閱讀幫助,我在文曲星上學會了賦值、條件、迴圈等程式設計中最基礎的知識。所以,正是文曲星教會了我程式設計,是指引我走上碼農之路的啟蒙老師。但也僅限於入門了,PC1000a的程式碼編輯體驗實在太糟糕了,在沒有電腦的情況下,很難開發超過10行的程式。

當時,數學正在學習極限、導數的內容,如果能把函式影象繪製出來,不少函式的極值能一眼看出來了,但可惜的是,絕大多數函式影象是很難通過手工畫出來的的。高一的時候,看過數學老師用電腦軟體演示過任意函式影象的繪製,感覺真 TMD 牛逼。

於是,我就想,能否通過程式設計,讓文曲星也能繪製任意函式的影象呢?然鵝,心有餘而力不足,我也只能是想想了,畢竟剛學會1+1=2,就想計算微積分,屬實是痴人說夢了。後來,班裡的一位電腦高手給我傳了個程式,號稱能在文曲星上繪製任意函式的影象,例如繪製y(x)=x*sin(x)的函式影象:

文曲星繪製函式影象

據高手說,這是他自己開發的,應該是真的吧,因為他還給喜歡的女孩開發了個類似flash的小動畫,程式設計能力槓槓的。那時他在開發中國象棋和任意函式求導的程式,據他說很複雜,應該是沒能在高中畢業前完成。

雖然我當時不知道他是如何做到繪製任意函式影象的,但是我用的很歡樂,晚上做題做累了,開啟程式,編輯個非常複雜的函式,看看影象長什麼樣子,也算是為數不多的消遣了。小鎮做題家的快樂,就是這麼樸實無華且枯燥😁

然鵝,沒多久,這種簡單的快樂就被下面的妖豔賤貨給取代了:

黃金英雄壇說

這是當年文曲星上非常火爆的《黃金英雄壇說》,也是我第一次接觸RPG遊戲,比較上癮,玩壞了兩個鍵盤,廢了幾十個5號電池。

三年前,為了再體驗一把當年的快樂,特意買了個橫版MiYoo開源遊戲機,自帶文曲星CC800模擬器並內建了《黃金英雄壇說》,上手5分鐘後放棄,操作太繁瑣了;也在 iPhone 上裝過《英雄壇說》,同樣是玩了5分鐘棄療了;即使是最近買的文曲星 PC1000a上,也只玩了10分鐘就退出了。

並非是遊戲不好玩,遊戲還是那個遊戲,但我已經不是那個我了:

高中,雖然家境貧寒,但也能吃飽穿暖,學習成績也不錯,基本沒有需要我操心的事

現在,上有老下有小,每天睜開眼就要面對生活、工作上的瑣事,何以解憂,唯有搞錢

如我和賣家的溝通一樣,我是因為「回憶青春」才買的這臺文曲星,開啟文曲星的瞬間,似乎又回到了無憂憂慮的少年時代,得以片刻的喘息。

其實,我現在是個不折不扣的的「垃圾佬」,買了挺多類似的二手老物件,以手機居多,以後有機會再找個主題分享給大家。

0x7. 冰火兩重天的體驗

高考前幾天,最後的一次模擬考試,年級第10名,是我高中時代最好的排名,科大,等我😁。高考,大概班級第30名左右,而平時都是在前3名徘徊的,是我整個高中最差的一次了,只比二本線高了40來分,科大,再見了😭。除了語文,所有科都考的很爛,媽的,我也不知道為啥,明明題目簡單的一匹,可能是過於輕敵了吧。

高考的滑鐵盧,著實讓我 emo 了好久,整日以淚洗面,不願踏出閨房半步。短短几天,從頂點跌入谷底,沒去東莞,也體驗了一把冰火兩重天。本想著復讀一年,圓了中科大的夢想,但是父母看到我的狀態,根本不敢讓我復讀,萬一來年又沒考好,你丫豈不是要玉玉到自掛東南枝了?

最後,在家人的勸說和化學老師的建議下,報了與中科大僅一字之差、一街之隔的醫科大:

中科大與安醫大

我在安醫和科大都聽過類似的故事:

某某因為學習壓力大,轉學到馬路對面了,那裡壓力小不少,從此杳無音信

地圖裡的科大中區,當年還是合肥學院,那麼安醫、安大、科大、合肥學院,誰是壓力較小的「馬路對面」呢?都不是,「馬路對面」是指中間的「第四人民醫院」,這是一所精神病醫院🐶

不過,我在那片區域流竄了9年,還真不知道「四院」具體在哪,也就沒見過它的真容了。沒想到,多年以後,我們一家三口走進了北京的一所精神病醫院:某年暑假,老婆來北京慰問我,自檢兩道槓。為了儘快確認一下是否真的陽了,我帶著她騎上我心愛的 N(>=3) 手電驢,以 25km/h 的速度飛奔向最近的一所大醫院 -- 回龍觀醫院。

當醫生得知我們要抽血檢查 HCG 時,用一種難以置信的語氣跟我說:

小夥子,你應該是來錯地方了,我們這是一所精神病醫院

臥槽,哈哈哈哈,醫生也忍不住笑了起來。啊,不好意思,再見了,您嘞!至今,老婆還會時不時地拿這事嘲諷一下我😁

言歸正傳,再說回高考。其實,在填志願之前,我從未考慮過學醫,我甚至都不知道安醫在合肥,我一直以為的安醫是蕪湖的皖南醫學院。我感興趣的是電子或化學類專業,象徵性地報了鄭大提前批的計算機系和安師大的化學系,曾經根本看不上的學校,如今也高攀不起了。學醫,將來哪怕是找不到工作,當個赤腳醫生也能混的不錯。聽上去也還行?那就從了吧。

決定認命之後,為了找點事做,避免胡思亂想導致又玉玉了,花100買了個小霸王學習機,又花35買了個 RPG 遊戲卡帶 --《封神榜》。購買《封神榜》,也是受《英雄壇說》影響,那裡面的劇情和對話都很好玩,以為所有 RPG 遊戲都是這樣,就找老闆隨便買了個 RPG 卡帶。事後,我才發現,我並不喜歡玩遊戲,尤其不喜歡這種練級類的遊戲,一來沒有耐心,二來打怪升級,實在是太無聊了。我只跟同學一起玩了前1/5劇情,剩下的都是他一個人玩通關的。

聽說小霸王上有個學習卡,支援BASIC程式設計,為了一睹她的芳容,我頂著40度的烈日,跑了好幾家店都沒找到,只能作罷。直到多年以後,我才用 PC 模擬器看到了學習卡的真面目:

FC 學習卡

如果當年找到了學習卡,會因為更早地學會了程式設計,影響我後來的發展軌跡嗎?我想大抵是不會的,橫豎都是不可能,因為即使是現在,面對黑乎乎的F-BASIC視窗,除了PRINT,我也實在想不起再輸入點啥了,何況當年小白的我。而且就在那個暑假,我還把表姐家的電腦借過來了1個多月,乾的最多的事就是在《搶灘登陸》和《雷電》裡打飛機。電腦技能方面,除了學會了安裝和解除安裝軟體,連打字的指法都沒嘗試去學,更別說學會程式設計了,這波是葉公好龍了,屬於是。

0x8. 未完待續 & 彩蛋

至此,花了好幾個晚上和兩個週末,碼了近7000字,終於把大學前的程式設計啟蒙階段寫完了。剩下的兩篇文章,也在準備素材了,爭取春節前更新完畢。因為現在毒圈已經縮小到公司同樓層了,如果我沒有按時交卷,除了在跟老婆友好地交換意見外,更大的可能就是我加入🐑圈了,請知悉。

在做了

其實,上面文曲星繪製的y(x)=x*sin(x)的影象是錯誤的,有細心的讀者發現嗎?這個程式是鹹魚賣家給我安裝的,估計是計算 y 座標的地方手抖了,多輸入了個負號,當年我同學給的那個是沒問題的。

前面提到,為了搞清楚按鍵事件監聽,我反編譯了奇葩計算器的 apk,發現了這樣一段程式碼:

java package xx.oo; public class SerialPortHelper {    private static Context mContext;    private static SerialPortHelper mInstance;   public SerialPortHelper() {   foo();      bar();   }   public static synchronized SerialPortHelper getInstance(Context context) {        SerialPortHelper serialPortHelper;        synchronized (SerialPortHelper.class) {            mContext = context;            if (mInstance == null) {                synchronized (SerialPortHelper.class) {                    if (mInstance == null) {                        mInstance = new SerialPortHelper();                   }               }           }            serialPortHelper = mInstance;       }        return serialPortHelper;   } }

JavaAndroid攻城獅幫忙 Review 一下,上面有幾處錯誤?