問:池老師芦瘾,我是個(gè)不愛互動(dòng)的人,但是您所有的文章我都看了集畅,非常感謝您的引導(dǎo)近弟,我入手了人生第一臺(tái) MBP。現(xiàn)在問題來了挺智,但是找不到更合適的人解答祷愉,只能求助于您了,如果您有時(shí)間的話赦颇。問題是這樣的:我有個(gè)32bit unix file(開啟一個(gè)服務(wù)進(jìn)程)二鳄,在 Mac 上執(zhí)行時(shí)錯(cuò)誤提示是:exec format error,但是在 Linux 服務(wù)器卻可以執(zhí)行媒怯,為何订讼?Mac 上有可以運(yùn)行的方案嗎?期待您的回復(fù)沪摄,不勝感激躯嫉。
答:Linux 和 OS X 是不同的操作系統(tǒng)纱烘,可以嘗試在 OS X 里重新編譯這個(gè)文件。
問:非常感謝祈餐!如果沒有文件源碼是不是就只能認(rèn)命了擂啥?
答:可以在 Mac 上裝 Docker,然后對(duì)服務(wù)進(jìn)行端口映射就可以了帆阳。
答:茅塞頓開哺壶。謝池老師。
以上是我和一位讀者的對(duì)話蜒谤,這位小伙子在拿到答案之后像一縷煙塵一樣消失無蹤山宾,之后再也沒有出現(xiàn)過。
在微信上加了很多 MacTalk 的讀者之后鳍徽,經(jīng)常會(huì)收到一些奇奇怪怪的問題资锰,關(guān)于職場、關(guān)于選擇阶祭、關(guān)于朋友绷杜、關(guān)于 Mac、關(guān)于技術(shù)等等濒募,不一而足鞭盟。但是我能回答的卻很少。問題不好沒法回答瑰剃,問題太復(fù)雜沒法回答齿诉,問題領(lǐng)域超出我的認(rèn)知也沒法回答,耗時(shí)太長的問題我也沒 時(shí)間回答晌姚,實(shí)在是慚愧的緊舀透。好在偶爾也能夠幫助一些小伙伴解決一些實(shí)際問題店展,心理上略感安慰吞鸭,比如上面這個(gè)問題远寸。
把這段程序員之間的對(duì)話翻譯一下,大致是這么個(gè)故事:
一 位讀者有一個(gè)32位的 Unix 可執(zhí)行文件猛遍,可以在某種版本的 Linux 服務(wù)器上正常運(yùn)行馋记,運(yùn)行這個(gè)文件作用就是起個(gè)進(jìn)程,開端口懊烤,然后與其他程序進(jìn)行交互梯醒。但是這個(gè)文件拿到 Mac 上完全沒辦法運(yùn)行。就在他趴在 Mac 上愁腸百結(jié)萬念俱灰的時(shí)候腌紧,突然想到了「池老師」茸习。不就是這個(gè)老家伙把 Mac 夸的像一朵玫瑰一樣,讓每個(gè)程序員都去采摘么壁肋?現(xiàn)在扎手了号胚,你不管誰管籽慢?于是他給我發(fā)來消息,意思就是管也得管猫胁,不管也得管箱亿,您看著辦。
我拿到問題一看弃秆,不難届惋。Linux 和 OS X 雖然師出同門,都是從老前輩 Unix 那兒畢業(yè)的菠赚,但是后來畢竟各練各的脑豹,在 Linux 編譯好的程序不可能在 OS X 上用,但是在 OS X 上重新編譯一下可能就沒事了衡查。我把這個(gè)想法告訴了這位程序員瘩欺,得到的反饋是:對(duì)不起哥,沒有源代碼拌牲!
我被這個(gè)冷酷的回復(fù)震驚了击碗,立刻意識(shí)到 剛才的想法并不是最優(yōu)解決方案,因?yàn)樵谥匦戮幾g的過程中们拙,各種包的依賴關(guān)系和編譯錯(cuò)誤足以讓你焦頭爛額,我隨即提供了 B 計(jì)劃:在 OS X 上安裝 Docker阁吝,輕量級(jí)的容器 Docker 可以運(yùn)行各種版本的 Linux砚婆,把文件扔到 Docker 里,然后通過主機(jī)和 Docker 之間的端口映射即可輕松解決這一問題突勇。
雖然這里面會(huì)涉及很多技術(shù)細(xì)節(jié)装盯,但是方向是沒有問題的,所以這位程序員立刻表示「茅塞頓開」甲馋,然后「biu 」的一聲就在屏幕對(duì)面消失了埂奈,沒有留給我說「不客氣」的機(jī)會(huì)。
這個(gè)問題裝個(gè) Linux 虛擬機(jī)也可以解決定躏,但是虛擬機(jī)過于耗費(fèi)資源账磺,而且不如 Docker 靈活,所以不是最佳解決方案痊远。Docker 是垮抗。
做為一個(gè)程序員,我們除了要掌握多門程序語言和多種數(shù)據(jù)庫碧聪,了解前端技術(shù)冒版、后端技術(shù),通曉網(wǎng)絡(luò)七層架構(gòu)逞姿,知道 TCP/IP三次握手和四次揮手辞嗡,編寫漂亮的代碼捆等,設(shè)計(jì)優(yōu)美的架構(gòu)……之外,我們還要解決研發(fā)续室、程序運(yùn)行和產(chǎn)品上線過程中遇到的各種問題栋烤,而且被要求以最 小的代價(jià)來解決問題……我們?nèi)菀讍幔?/p>
除了編程技巧和程序設(shè)計(jì)能力,解決問題的穩(wěn)準(zhǔn)狠是衡量一個(gè)程序員是否優(yōu)秀的重要因素之一猎贴,也是資深技術(shù) 人員真正的價(jià)值所在班缎。在科技浪潮澎湃、技術(shù)信息撲面而來的今天她渴,一位剛畢業(yè)的大學(xué)生如果足夠勤奮达址,他可以在兩三個(gè)月之內(nèi)掌握一門編程語言,并編寫出像模像 樣的軟件趁耗,他們的學(xué)習(xí)速度甚至超過了我們這些老程序員沉唠,但是解決問題的能力是無法速成的,只能依靠時(shí)間苛败、經(jīng)驗(yàn)和慘痛的教訓(xùn)歷練而成满葛。有時(shí)候還需要靈感和運(yùn) 氣。
很多軍迷讀了大量的軍事著作和歷史小說罢屈,常常羨慕那些名將的風(fēng)采嘀韧,并浩嘆自己「生不逢時(shí)」。但是名將不是那么容易煉成的缠捌。歷史上叱詫風(fēng) 云的名將鳳毛麟角锄贷,他們親自持刀上陣追擊敵人,見識(shí)戰(zhàn)場的慘烈曼月,目睹敵人的尸體谊却,看到戰(zhàn)友被殺,知道被刀看中會(huì)流血死去哑芹,他們冷酷無情炎辨,堅(jiān)如磐石,在全軍 即將崩潰的時(shí)候發(fā)現(xiàn)敵人的弱點(diǎn)并進(jìn)行攻擊聪姿,在瞬息萬變的戰(zhàn)場進(jìn)行決斷碴萧,在多次失敗后從無數(shù)士兵的尸體里站起來重新出發(fā)去挑戰(zhàn)那個(gè)戰(zhàn)勝你的對(duì)手,在所有人對(duì) 你說「指導(dǎo)員末购,我們上吧」的時(shí)候勿决,堅(jiān)定的說出那三個(gè)字:再等等!
如果你做不到這些招盲,那還是做個(gè)最終會(huì)被張飛槍挑的小兵吧低缩。
優(yōu)秀的程序員同樣如此,菜鳥常常羨慕高手在談笑之間讓難題灰飛煙滅,而自己卻苦苦思索而不得入門之法咆繁,殊不知這些高手同樣經(jīng)歷了名將的那些腥風(fēng)血雨讳推。他們?cè)?清晨的微光里編寫代碼,在轟鳴的機(jī)房中調(diào)試程序玩般,他們徹夜不眠就是為了解決一個(gè) bug银觅,他們要承受數(shù)據(jù)丟失或上線失敗的痛苦,默默吞下眼淚坏为,準(zhǔn)備下一次的戰(zhàn)斗究驴。不停的學(xué)習(xí)、實(shí)踐和思索匀伏,成千上萬個(gè)小時(shí)之后洒忧,高手史成。
同樣的問題够颠,高手的解決思路和小球是截然不同的熙侍。一般來說,只要不是世界難題履磨,給足時(shí)間蛉抓、空間和人力,都能解決剃诅。如果你遇到問題告訴上級(jí)巷送,這個(gè)問題交給我 了,兩年之內(nèi)搞的妥妥噠矛辕,那就不要怪項(xiàng)目組組團(tuán)把你打出翔來惩系,因?yàn)榇蠹乙氖欠址昼娊鉀Q,不是兩年如筛。在這個(gè)唯快不破的年代,我們沒有這么多的時(shí)間抒抬,所以要 通過逆向思維杨刨、經(jīng)驗(yàn)教訓(xùn)、輾轉(zhuǎn)騰挪擦剑、借力打力等方式以最小的代價(jià)快速解決問題妖胀。這才是老程序員的價(jià)值。
再舉個(gè)例子惠勒,一個(gè)運(yùn)行良好的線上應(yīng)用在你修改 bug 增加功能之后重新上線出現(xiàn)了一些莫名其妙的問題赚抡,比如占用資源增加或運(yùn)行一段時(shí)間宕機(jī)等等,怎么解決纠屋?
常規(guī)的做法就是通過閱讀日志涂臣、模擬線上環(huán)境和調(diào)試程序來定位錯(cuò)誤。容易的 bug 用這些方式基本就能搞定了,但是更隱蔽的 bug 會(huì)耗費(fèi)大量的時(shí)間和人力赁遗。更好的方式是什么署辉?
首先,排查是程序問題還是環(huán)境問題岩四,把線上程序恢復(fù)到運(yùn)行正常時(shí)的老版本哭尝,如果出現(xiàn)了同樣的問題,那就是生產(chǎn)環(huán)境發(fā)生了改變剖煌。如果運(yùn)行正常材鹦,要么是你修改老 bug 時(shí)引入了新 bug,要么是新增加的代碼出現(xiàn)了問題耕姊。
其次桶唐,閱讀產(chǎn)品的 changelog,根據(jù)代碼提交的時(shí)間線構(gòu)建系統(tǒng)箩做,通過二分法排查莽红,定位是哪部分代碼引起的問題。
最后邦邦,排除了所有的不可能安吁,剩下的無論看起來如何不可能,就是它干的燃辖。
以上只是一個(gè)簡單的例子鬼店,實(shí)際的情況可能比這個(gè)例子復(fù)雜一百倍,需要我們綜合使用各種方式進(jìn)行交叉比對(duì)和錯(cuò)誤排查才能解決黔龟。這僅僅是遇到問題解決問題妇智,更多的時(shí)候是需要你提出問題,并解決問題氏身,那是更高的境界巍棱。
很多人學(xué)了那么多編程語言,寫了十幾年程序蛋欣,最終依然無法做到以最小的代價(jià)解決問題航徙,不禁讓人扼腕嘆息。
程序員真正的價(jià)值是什么陷虎?以最小的代價(jià)解決問題到踏!知行合一,方可無敵于天下尚猿。