當(dāng)我們說(shuō)軟件工程師的時(shí)候我們?cè)谡f(shuō)什么

基于個(gè)人的經(jīng)歷和理解,下面內(nèi)容列出了我認(rèn)為對(duì)于一個(gè)軟件工程師最重要的六個(gè)方面,然后對(duì)于每個(gè)方面我給出了解釋和例子。如果你對(duì)這個(gè)話題有興趣,請(qǐng)?jiān)谠u(píng)論寫(xiě)下你的觀點(diǎn)和看法,謝謝!


您還可以在這里找到我:

英文版請(qǐng)前往:


計(jì)算機(jī)科學(xué)的基礎(chǔ)

如果你在日常的工作中從來(lái)沒(méi)有認(rèn)識(shí)到一些基本的數(shù)據(jù)結(jié)構(gòu),算法知識(shí),以及設(shè)計(jì)模式對(duì)一個(gè)軟件工程師來(lái)講是必不可少的,那么我就有理由對(duì)你是不是一個(gè)合格的軟件工程師而產(chǎn)生懷疑。這里我說(shuō)計(jì)算機(jī)科學(xué)的基礎(chǔ)知識(shí),是因?yàn)樽鳛橐粋€(gè)軟件工程師而不是一個(gè)計(jì)算機(jī)科學(xué)家,我們完全沒(méi)有必要去深入的研究探索某個(gè)概念或者更某個(gè)算法。我們僅僅只需要知道一些比較基礎(chǔ)的原理,和用代碼實(shí)現(xiàn)這些原理的方法。

例子 1

現(xiàn)在你的任務(wù)是編寫(xiě)一個(gè)英語(yǔ)聽(tīng)力測(cè)驗(yàn)的軟件,假設(shè)你有100個(gè)英語(yǔ)句子和它們的錄音,你將會(huì)讓用戶聽(tīng)這些錄音并且寫(xiě)下來(lái)錄音里的內(nèi)容,然后去和原始的句子比對(duì)看看區(qū)別有多大,你應(yīng)該怎么做來(lái)比對(duì)這兩個(gè)句子?

你瞬間就能意識(shí)到你應(yīng)該用edit distance, 然后你能在10分鐘以內(nèi)完成代碼實(shí)現(xiàn)。

你隱約記得有種方法是專門(mén)用來(lái)計(jì)算兩個(gè)字符串的相似/相同,你花了15分鐘在網(wǎng)上找到了這個(gè)東西叫edit distance, 然后你又花了15分鐘找到了實(shí)現(xiàn)方法然后貼在你的代碼里。

完全不知道怎么辦

例子 2

你現(xiàn)在要在一個(gè)軟件的輸入框里添加撤銷(xiāo)/恢復(fù)的功能。

兩個(gè)棧(stack): undoStack [] 和 redoStack [].

  • 輸入 a, push a 到 undoStack, undoStack = [a], redoStack = [], input = a
  • 輸入 b, push b 到 undoStack, undoStack = [a, b], redoStack = [], input = ab
  • 輸入 c, push c 到 undoStack, undoStack = [a, b, c], redoStack = [], input = abc
  • 撤銷(xiāo), undoStack 出棧一個(gè)元素, push 這個(gè)出棧的元素到 redoStack, undoStack = [a, b] and redoStack = [c], input = ab
  • 撤銷(xiāo), undoStack 出棧一個(gè)元素, push 這個(gè)出棧的元素到 redoStack, undoStack = [a] and redoStack = [c, b], input = a
  • 恢復(fù), redoStack 出棧一個(gè)元素, push 這個(gè)出棧的元素到 undoStack, undoStack = [a, b] and redoStack = [c], input = ab

完全不知道怎么辦

例子 3

你聽(tīng)見(jiàn)有人在談?wù)撿巢瞧酰‵ibonacci)

首先想到的是遞歸(recursion).

首先想到的是1 1 2 3 5 8.

什么都沒(méi)想到


某種語(yǔ)言的代碼能力和解決問(wèn)題的能力

大家都知道軟件工程師寫(xiě)代碼,所以不需要太多語(yǔ)言來(lái)解釋為什么代碼能力很重要。關(guān)于不同語(yǔ)言的選擇問(wèn)題,在某種方面看來(lái),所以的語(yǔ)言都是一樣的,它們都是一種工具來(lái)讓計(jì)算機(jī)做我們想做的事情。每種語(yǔ)言都有它們各自的特點(diǎn),優(yōu)點(diǎn)以及缺點(diǎn),作為一個(gè)軟件工程師你必須要至少掌握其中一種語(yǔ)言。

對(duì)于一種語(yǔ)言語(yǔ)法以及內(nèi)建庫(kù)/函數(shù)的熟悉是代碼能力中很重要的一個(gè)方面。但是在剛開(kāi)始學(xué)習(xí)這門(mén)語(yǔ)言的時(shí)候,死記硬背這些東西貌似并不是一個(gè)明智的選擇。經(jīng)常查文檔來(lái)獲取這些還沒(méi)有那么熟悉的東西的這種行為絕對(duì)不是代碼能力不夠的體現(xiàn)。

注:以下的例子都是Javascript

例子 1

一個(gè)很常見(jiàn)的問(wèn)題就是我們需要把URL里的參數(shù)提出來(lái)并且轉(zhuǎn)化為一個(gè)Javascript的Object。假設(shè)這個(gè)URL是:http://helloworld.com?user=haochuan&param1=aaa&param2=bbb,我們應(yīng)該怎么樣將它轉(zhuǎn)化為以下的Object:

{
    user: "haochuan",
    param1: "aaa",
    param2: "bbb"
}

正則表達(dá)式

const URL = "http://helloworld.com?user=haochuan&param1=aaa&param2=bbb";
const RE = /(\?|\&)([^=]+)\=([^&]+)/g;
let paramsObject = {};

URL.replace(RE, (match, p1, p2, p3) => {
    paramsObject[p2] = p3;
});

console.log(paramsObject);
// will be { user: 'haochuan', param1: 'aaa', param2: 'bbb' }

URL.split('?') -> split('&') -> split('='), 然后構(gòu)建這個(gè)Object。

完全不知道怎么辦

例子 2

你的同事讓你幫他寫(xiě)個(gè)函數(shù),交換兩個(gè)整數(shù), 不能用任何臨時(shí)變量。

function swapNumb(a, b){
  a = a ^ b;
  b = a ^ b;
  a = a ^ b;
}
function swapNumb(a, b){
  b = b - a;
  a = a + b;
  b = a - b;
}

沒(méi)有了臨時(shí)變量完全不知道怎么辦

例子 3 (語(yǔ)言特性)

從1到5每隔一秒打印出一個(gè)數(shù)字

for (var i = 1; i < 6; i++) {
    (function (num) {
        setTimeout(function (){
            console.log(num);
        }, 1000);
    })(i);
}
for (var i = 1; i < 6; i++) {
    setTimeout(function (){
        console.log(num);
    }, 1000);
}
例子 4 (注釋和文檔)

保證你在五年之后看今天你寫(xiě)的代碼的時(shí)候能夠較快的明白你當(dāng)時(shí)想要干嘛,然后在你的代碼里合理的利用FIXME, TODO, REMOVEME等標(biāo)簽

/**
 * Function to return the sum of two integer
 * @param  {Integer} a first integer
 * @param  {Integer} b second integer
 * @return {Integer}   sum of a and b
 */

// TODO: support float sum in next month
function sum(a, b) {
    return a + b;
}
function sum(a, b) {
    return a + b;
}

開(kāi)發(fā)工具的熟練度

沒(méi)有必要所有人都要是vim或者emacs的大神,但是你必須能夠玩轉(zhuǎn)至少一個(gè)你喜歡的編輯器/IDE,包括各種插件,自動(dòng)化,以及git和常用的命令行命令。

例子 1

假設(shè)你有一個(gè)3行的Javascript文件,然后每行的末尾都忘記了分號(hào),現(xiàn)在你想把分號(hào)加進(jìn)來(lái),應(yīng)該怎么做?

const HOST = 'http://host.com'
const API = '/api/getPage'
loadContent(HOST + API)
  • vim

gg -> shift + a -> ; -> Esc -> j -> . -> j -> .

  • sublime

自己寫(xiě)插件或者網(wǎng)上找插件來(lái)完成這種常用的操作

眼睛找 - 鼠標(biāo)點(diǎn) - 鍵盤(pán)上點(diǎn)分號(hào)鍵 - 重復(fù)三遍

例子 2

假設(shè)你有一個(gè)3行的Javascript文件,你想要替換第2航和第三行的內(nèi)容,應(yīng)該怎么做?

const HOST = 'http://host.com';
loadContent(HOST + API);
const API = '/api/getPage';
  • vim

3gg -> Esc -> :m 1 -> Enter

  • sublime

鼠標(biāo)單擊第三行的任意地方,然后Command + Control + upArrow

全選 - 復(fù)制 - 新建一行 - 粘貼

熟悉軟件開(kāi)發(fā)的流程和步驟

盡管在有些公司會(huì)有人來(lái)專門(mén)幫你做這些事情,但是如果你對(duì)這整個(gè)流程比較了解的話,會(huì)讓你生活輕松點(diǎn)并且節(jié)約很多時(shí)間。

  • 知道怎么用git/svn來(lái)跟其他人合作
  • 知道怎么快速的設(shè)置開(kāi)發(fā)環(huán)境
  • 知道一個(gè)產(chǎn)品的開(kāi)發(fā)流程
  • 知道怎么部署你的代碼
  • 知道測(cè)試相關(guān)的內(nèi)容

學(xué)習(xí)能力

在我看來(lái)強(qiáng)行的要求每個(gè)軟件工程師都用一樣的東西和擁有一樣的技術(shù)棧是幾乎不可能的事情,即使他們有著相同的職位和相同的工作內(nèi)容,所以在平時(shí)的工作中我們有一部分時(shí)間花在了學(xué)習(xí)別人熟悉的技術(shù)和任何人都不熟悉的新技術(shù)上。讓我們回到React剛開(kāi)始變火的那個(gè)時(shí)候,是否能在短時(shí)間內(nèi)判斷出react到底好不好,是否能在短時(shí)間內(nèi)判斷出哪個(gè)flux的實(shí)現(xiàn)更適合你的項(xiàng)目,是否能在短時(shí)間內(nèi)開(kāi)始用React來(lái)替換你之前的工具,這些就是所謂的學(xué)習(xí)能力。假設(shè)你從來(lái)沒(méi)有用過(guò)bootstrap,通過(guò)官方的文檔和網(wǎng)上的各種資源,你需要多長(zhǎng)時(shí)間才能把這個(gè)新東西用到你自己的項(xiàng)目里,這就是所謂的學(xué)習(xí)能力。


溝通能力

以下我列出了在我的經(jīng)歷中我認(rèn)為最重要的幾點(diǎn):

  • 方法不限,形式不限,能不能用簡(jiǎn)短的語(yǔ)言和在有限的時(shí)間里讓其他的工程師理解你寫(xiě)的代碼?
  • 方法不限,形式不限,能不能在有限的時(shí)間里理解其他工程師所寫(xiě)的代碼?
  • 如果你現(xiàn)在的項(xiàng)目有一個(gè)新的工程師加入,你能不能很好的幫助他來(lái)快速熟悉項(xiàng)目并且保證他在短時(shí)間內(nèi)就可以對(duì)項(xiàng)目有所貢獻(xiàn)?
  • 你能在開(kāi)各種會(huì)的時(shí)候簡(jiǎn)介明了的表達(dá)你的問(wèn)題和觀點(diǎn)么?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,045評(píng)論 25 709
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,697評(píng)論 18 399
  • 臥底經(jīng)濟(jì)學(xué)第一部 第五章 眾所周知,跨行業(yè)消費(fèi)時(shí)容易出現(xiàn)為商品支付高昂費(fèi)用的風(fēng)險(xiǎn),經(jīng)濟(jì)學(xué)家稱之為“信息不對(duì)稱”,也...
    只是個(gè)稱呼而已閱讀 348評(píng)論 0 0
  • 國(guó)慶長(zhǎng)假第一天陪兒子閑逛,居然碰到有這樣做生意的。 這是一家玩具店,店內(nèi)懸掛著各種各樣的卡通絨布玩具,很能吸引孩子...
    陶語(yǔ)閱讀 684評(píng)論 13 8
  • 洛枳,洛枳,橘生淮北則為枳,生澀的枳。 盛淮南,盛淮南,小橋流水人家的淮南,溫潤(rùn)的淮南。 生澀的枳,溫潤(rùn)的淮南。這...
    土豆不吃馬鈴薯閱讀 1,013評(píng)論 0 2

友情鏈接更多精彩內(nèi)容