当我们说软件工程师的时候我们在说什么

基于个人的经历和理解,下面内容列出了我认为对于一个软件工程师最重要的六个方面,然后对于每个方面我给出了解释和例子。如果你对这个话题有兴趣,请在评论写下你的观点和看法,谢谢!


您还可以在这里找到我:

英文版请前往:


计算机科学的基础

如果你在日常的工作中从来没有认识到一些基本的数据结构,算法知识,以及设计模式对一个软件工程师来讲是必不可少的,那么我就有理由对你是不是一个合格的软件工程师而产生怀疑。这里我说计算机科学的基础知识,是因为作为一个软件工程师而不是一个计算机科学家,我们完全没有必要去深入的研究探索某个概念或者更某个算法。我们仅仅只需要知道一些比较基础的原理,和用代码实现这些原理的方法。

例子 1

现在你的任务是编写一个英语听力测验的软件,假设你有100个英语句子和它们的录音,你将会让用户听这些录音并且写下来录音里的内容,然后去和原始的句子比对看看区别有多大,你应该怎么做来比对这两个句子?

你瞬间就能意识到你应该用edit distance, 然后你能在10分钟以内完成代码实现。

你隐约记得有种方法是专门用来计算两个字符串的相似/相同,你花了15分钟在网上找到了这个东西叫edit distance, 然后你又花了15分钟找到了实现方法然后贴在你的代码里。

完全不知道怎么办

例子 2

你现在要在一个软件的输入框里添加撤销/恢复的功能。

两个栈(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
  • 撤销, undoStack 出栈一个元素, push 这个出栈的元素到 redoStack, undoStack = [a, b] and redoStack = [c], input = ab
  • 撤销, undoStack 出栈一个元素, push 这个出栈的元素到 redoStack, undoStack = [a] and redoStack = [c, b], input = a
  • 恢复, redoStack 出栈一个元素, push 这个出栈的元素到 undoStack, undoStack = [a, b] and redoStack = [c], input = ab

完全不知道怎么办

例子 3

你听见有人在谈论斐波那契(Fibonacci)

首先想到的是递归(recursion).

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

什么都没想到


某种语言的代码能力和解决问题的能力

大家都知道软件工程师写代码,所以不需要太多语言来解释为什么代码能力很重要。关于不同语言的选择问题,在某种方面看来,所以的语言都是一样的,它们都是一种工具来让计算机做我们想做的事情。每种语言都有它们各自的特点,优点以及缺点,作为一个软件工程师你必须要至少掌握其中一种语言。

对于一种语言语法以及内建库/函数的熟悉是代码能力中很重要的一个方面。但是在刚开始学习这门语言的时候,死记硬背这些东西貌似并不是一个明智的选择。经常查文档来获取这些还没有那么熟悉的东西的这种行为绝对不是代码能力不够的体现。

注:以下的例子都是Javascript

例子 1

一个很常见的问题就是我们需要把URL里的参数提出来并且转化为一个Javascript的Object。假设这个URL是:http://helloworld.com?user=haochuan&param1=aaa&param2=bbb,我们应该怎么样将它转化为以下的Object:

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

正则表达式

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('='), 然后构建这个Object。

完全不知道怎么办

例子 2

你的同事让你帮他写个函数,交换两个整数, 不能用任何临时变量。

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;
}

没有了临时变量完全不知道怎么办

例子 3 (语言特性)

从1到5每隔一秒打印出一个数字

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 (注释和文档)

保证你在五年之后看今天你写的代码的时候能够较快的明白你当时想要干嘛,然后在你的代码里合理的利用FIXME, TODO, REMOVEME等标签

/**
 * 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;
}

开发工具的熟练度

没有必要所有人都要是vim或者emacs的大神,但是你必须能够玩转至少一个你喜欢的编辑器/IDE,包括各种插件,自动化,以及git和常用的命令行命令。

例子 1

假设你有一个3行的Javascript文件,然后每行的末尾都忘记了分号,现在你想把分号加进来,应该怎么做?

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

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

  • sublime

自己写插件或者网上找插件来完成这种常用的操作

眼睛找 - 鼠标点 - 键盘上点分号键 - 重复三遍

例子 2

假设你有一个3行的Javascript文件,你想要替换第2航和第三行的内容,应该怎么做?

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

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

  • sublime

鼠标单击第三行的任意地方,然后Command + Control + upArrow

全选 - 复制 - 新建一行 - 粘贴

熟悉软件开发的流程和步骤

尽管在有些公司会有人来专门帮你做这些事情,但是如果你对这整个流程比较了解的话,会让你生活轻松点并且节约很多时间。

  • 知道怎么用git/svn来跟其他人合作
  • 知道怎么快速的设置开发环境
  • 知道一个产品的开发流程
  • 知道怎么部署你的代码
  • 知道测试相关的内容

学习能力

在我看来强行的要求每个软件工程师都用一样的东西和拥有一样的技术栈是几乎不可能的事情,即使他们有着相同的职位和相同的工作内容,所以在平时的工作中我们有一部分时间花在了学习别人熟悉的技术和任何人都不熟悉的新技术上。让我们回到React刚开始变火的那个时候,是否能在短时间内判断出react到底好不好,是否能在短时间内判断出哪个flux的实现更适合你的项目,是否能在短时间内开始用React来替换你之前的工具,这些就是所谓的学习能力。假设你从来没有用过bootstrap,通过官方的文档和网上的各种资源,你需要多长时间才能把这个新东西用到你自己的项目里,这就是所谓的学习能力。


沟通能力

以下我列出了在我的经历中我认为最重要的几点:

  • 方法不限,形式不限,能不能用简短的语言和在有限的时间里让其他的工程师理解你写的代码?
  • 方法不限,形式不限,能不能在有限的时间里理解其他工程师所写的代码?
  • 如果你现在的项目有一个新的工程师加入,你能不能很好的帮助他来快速熟悉项目并且保证他在短时间内就可以对项目有所贡献?
  • 你能在开各种会的时候简介明了的表达你的问题和观点么?
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,084评论 25 707
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,505评论 18 399
  • 卧底经济学第一部 第五章 众所周知,跨行业消费时容易出现为商品支付高昂费用的风险,经济学家称之为“信息不对称”,也...
    只是个称呼而已阅读 307评论 0 0
  • 国庆长假第一天陪儿子闲逛,居然碰到有这样做生意的。 这是一家玩具店,店内悬挂着各种各样的卡通绒布玩具,很能吸引孩子...
    陶语阅读 600评论 13 8
  • 洛枳,洛枳,橘生淮北则为枳,生涩的枳。 盛淮南,盛淮南,小桥流水人家的淮南,温润的淮南。 生涩的枳,温润的淮南。这...
    土豆不吃马铃薯阅读 947评论 0 2