时空主站

嗨,我是时空,一名来自中国的开发者。

0%

很早以前就想写一篇和面试相关的文章了,今天在网络上看到一篇关于如何去面试程序员的英文文章,发现其中有很多和我共鸣的东西,所以仿照其标题通过自己的经历写下了这篇文章。

工作这么多年来,即被面试过,也面试过他人,对于程序员的面试,经历过很不错的面试,很专业的面试,也经历过一些BT和令人不爽的面试,我个人觉得一个好的面试,面试官是很重要的,所以,本文想从“面试官”的角度来阐述一下。于是,有了下面这样一篇的文章,希望本文对你的职场经历有用,特别是那些正在招聘和面试程序员的朋友,我觉得这篇文章会对大家有很多启示。此外,做为被面试的人,你可以看看本站的《别的程序员是怎么读你的简历的》《程序员需要具备的基本技能》《优秀程序员的十个习惯》其它一些和程序员相关的文章

对于招聘方来说,在招聘程序员的时候,我估计面试应聘者时,最主要想知道的是下面三件事:

  1. 这个程序员的是否够聪明?
  2. 这个程序员能否把事情搞定?
  3. 这个程序员能和我的团队在一起工作吗?

我相信,这是所有团队经理招人要考虑的三个问题,所有的问题也基本上围绕着这三个问题。有些时候,你也许觉得程序员的技术技能可以同时解决这三个问题,一个技术能力优秀的人必然是一个聪明的,可以搞定事情的人,当然也就能和团队一起工作了。是的,感觉看起来是这个样子,但其实并不是这样的。有些人的确很聪明,但却不能处理好工作上的事情,这样人应该是你的朋友,你的顾问,但不应该是你的雇员。有的人为人很不错,和团队所有人都合得来,但并不是很聪明,但工作很刻苦很努力,这样的人可以成为你的下属,比如某个下属骨干的助手,或是整个团队的助手。如果某个人不能和团队一起工作,无论其有多聪明,解决问题的能力有多强,你都不应该和他在一起工作。人个认为,团队的和谐是一切事情的前提。

对于传统的面试招聘过程,基本上来说都是下面这样的样子的:

  1. 阅读应聘者的简历,让应聘者做个自我介绍。
  2. 问一些比较难的非常细节的技术问题,以一问一答的形式。
  3. 给面试者一些和几个编程难题。(比如某些怪异的算法题)

我个人觉得这种面试方法很可笑,也很糟糕,尤其是后面两点。通常来说,这样的面试只会让你面试到一些“书呆子”或是一些“技术痴迷者”,下面让我来一条一条地剖析一下这几条的弊端。

  1. 你很难从一个人的简历或是自我介绍上了解一个人。因为这些都是当事人自己写的,或是自己阐述的。所以,这并不是很准确的,通过简历,你只能知道很简单的事情,这对于是否能招入团是远远不够的。而在面试的开始,让应聘者做自我介绍,只会让面试者以很正式的态度来面对整个面试。一但面试过程很正式,很严肃,就会让人很拘禁,其实,这并不是我们想要的,我要的是应聘者真实和自然的表现,从而才能了解到最真实的东西
  2. 问几个技术细节的问题。比如:我个人经历过的——“ps的-a参数是什么意思?”,“vi中删除换行符的命令是什么?”,“C++的关键字explict,mutable是用来干什么?”等等,等等。以前做为一个应聘者来说,我非常讨厌这样的问题,因为这样的问题查一下手册就知道。难道他要招的是一个字典手册?不是一个人?对于这方面,重要的不是知识,重要的是其查找知识的能力
  3. 给应聘者一个或几个很难的算法题,给上十几分钟,然后让面试者把伪代码或是代码写下来。这样的做法是相当可笑的,不能讨论不能查资料,让人在一种压力状态下作答,这根本就不是实际工作中的状态,而我们的面试也就成了一种刁难(我最变态的经历是,当我把写在两页纸上的代码上交上去后,面试官把其交给旁边程序员输出电脑做校验,结果程序员说,编译出错。于是,面试官说,“很遗憾,可能你写的程序还不多”,相当可笑)。对于这点来说,重要的不是那个解题的答案,而是解题的思路和方法

我以前经历过很多的面试,当技术人员来和我做面试的时候,我发现,“技术人员的思维”对于某些人来说根本分不清面试和考试,在潜意识里,他们在很多时候不是在面试这个人,而是在刁难这个人并以此展示自己的技能。我个人认为我是一个好的程序员,但我可以告诉你我无法通过那样的面试,因为那样的面试是为他们自己准备的,而不是为应聘者准备的。

那么,我又是怎样去面试的呢?

一、确认简历。首先,阅读一下别人的简历是需要的,从简历上,工作经历,项目经历,技术技能这三个事情是你需要了解的。一般来说,你可以先通过电话确定一下他的工作经历,项目经历和技术技能,然后,如果他和你需要的人条件相符的话,可以叫到公司做面对面的面试。千万不要把别人叫来,你又说你的经历和我们的工作有差距之类的话。(我有过一次面试经历,公司我不说了,反正是那个号称需要有良好沟通的公司,面试了我9次左右,从一般的程序员,PM,经理,到总经理,而最后一次直接告诉我,我以前的经历和他们的要求差距很大。我不禁要问了,前面若干次的面试他们都在干什么呢?)

二、面试开场。其次,把人邀请来公司面试,应聘者到了公司来面试,有一点很重要,那就是你一定要让整个面试过程变得很随意,很放松,就像普通的聊天和一般朋友间的交流一样。这样应聘者才会放松并拿出真实的样子来和你谈话和聊天,你才能在很短的时间内了解得更多。让应聘者放下心理负担,让其表现得自然一些,这是招聘方的责任。千万不要说,别人太紧张发挥的不好,有时候,招聘方得想想自己的问题。

面试开场的时候,千万不要让应聘者介绍自己,因为,应聘者早就给你发过简历了,而你也给其打过电话了。另外,应聘者对这个面试惯例通常都会准备得非常不错的,另一方面,这会让整个面试过程太正式太严肃了。所以,不妨问问应聘者是怎么过来的?最近怎么样?还可以和应聘者谈一个大众话题,比如喜欢什么体育,音乐,电影,社会热点什么的,自己也别板着个脸,说说笑笑,试图让大家都放松下来。另外,通过这些闲聊,你可以知道他/她的与人交往能力和一些性格。另外,不要让桌子放在你和应聘者之间,把环境搞得随意一些。

三、多让应聘者说说他的经历。接下来,如果你要觉得这个应聘者是否是一个可以解决问题,是一个可以把事情搞定的人,不用问他/她会做什么,直接问问其做过什么?干过什么事?对于一个好的程序员来说,很难想像其没有相关的实践,就算你是在大学里,你也应该做过什么。如果你有解决问题的能力,那么,很显然,今天你应该解决了很多问题,也搞定了很多事情,听听应聘者说一说他的那些事。(不要使用一问一答这种方式,应该让应聘者多说,而多听,多想)

在他讲他的项目的时候,通常来说你要注意下面几点:

  • 沟通表达能力。应聘者能不能把一个事情讲清楚。如果这个人聪明的话,他就可以用最简单的语言把一个复杂的事情讲清楚。而且,这是一个好的程序员最基本的能力。而且,你可以在应聘者一边描述其经历的时候,你可以和应聘者有一些的良好的来来回回的交谈,这样就可以知道,他的沟通能力和沟通方式,从而了解他的性格,。
  • 角色和位置。也许他参与了一个很大的项目,但只是做了一个很简单的模块。所以,了解其在项目中的担任的角色和位置是非常必要的。当应聘者说到“我们”或者“大家”之类的词汇时,一定要向下细化和明确。
  • 做出的贡献和解决了什么的问题。这个很重要,通过了解这个,你可以知道面试者是否聪明,是否有能力解决问题,是否有好的技术底子。
  • 演示。如果可能,你可以让应聘者展示一些其写过的代码,做过的设计,或是直接给你看看他写的程序的演示。(从设计上,代码的风格,重用性,维护性上你可以了解很多很多)
  • 基础知识。了解该项目中应聘者使用的技术的一些基础知识,比如,通过整个过程,你可以问一些网络,语言,面象对象,系统的一些基础知识。基础知识是非常重要的,这直接关系到了他的能力。
  • 流程和工具。了解应聘者所熟悉的项目的流程(银弹,瀑布,敏捷,……),还有流程中的一些工件(如:需求文档,设计文档,测试方档等),以及在开发过程中使用的工具(内存测试,代码检查,BUG报告,版本维护,开发调试……)(关于程序员的基本技能,你可以参考——《程序员需要具备的基本技能》)

有人会说,应聘者的经历可以被他自己编出来的,他可以把一些不是他做的事说成是他做的。是的,的确是有这种可能。不过,不要忘了,一个谎言背后需要用更多的谎言来圆谎的,所以,你不必担心这个问题,只要你在应聘者的描述过程中逐步求精,细化问题,你会知道应聘者是否是在编故事的。

千万记住下面几点:

  • 谈话风格要随意和自然,不要正式。
  • 在了解应聘者以前做过的事的时候,不要太投入了。因为招聘方也是技术人员,所以有时候,招聘者自己会因为应聘者所做的项目中的技术太过迷人而被吸引了。
  • 要注意引导应聘人。相信我,应聘的程序员十个人有八个人讲不清楚以前做的是什么。因为他们直接跳过了项目背景和要解决什么样的问题,而直接进入具体实现。
  • 不要一问一答,应该多让应聘者说,这样才能多全方位了解一个人。
  • 了解一个人的过去,了解一个人做过的事情,比其会做什么更重要。
  • 了解一个人的性格,想法,思维和行为,比了解其技术技能更重要。
  • 沟通能力,表达能力,语言组织能力,理解能力,等方面的能力,关系到了是否能和别人一起工作。
  • 基础知识比知识的点滴要重要得多。你可能不知道其个C++的关键字,但你应该要知道C++的继承和多态。
  • 技术技能固然很重要,但比其更重要的是这个人获取知识的能力,学习能力是在计算机这样变化飞快行业中必需具备的。
  • 是否可以进行培养,比掌握的技能更重要。

四、实际参与??这一步可能是很不好实施的。因为,这需要一些应聘者付出一定的时间,如果是毕业生,那没有问题,先让他来实习一段时间。但如果别人有工作,就不好了。也许你会说,这就是试用期的用处了。不过,我个人觉得,你得要尊重应聘者,人家把那边的工作辞了,来你这边工作,三个月试用期间,如果没有什么原则上的问题,你作为一个招聘方又反悔了,这样做很是相当的不好。如果发现这样的事,只能是招聘者自己的问题。

在面试过程中,一些招聘者会让应聘者们一起做个游戏,或是搞个辩论比赛,或是现场组个团队干个简单的事情,有的甚至让应聘者请一天假到自己的公司里来和自己的团队一同工作一天,并要完成某个事情(甚至给其设置上deadline),并通过这些来考量应聘者的实际参与能力。

是的,如果没有一起工作过,没有一些实际的事情发生,单靠几个小时的面试很难了解一个人的。设置上这些面试的环节,在最短的时间内来了解应聘者的一切,对于招聘方来说无可厚非。而且有的时候也能得到不错的效果。在这里,我只提一点,有时候这样的周期拉得很长,让应聘者付出了很多,反尔会让应聘者产生反感和厌烦情绪,从某种意义上来说,这实在是对应聘者的不尊重。

对于这一点,我一直持疑问的态度,所以,我在其后打了两个问号。老实说,对于实际参与这一环节,我个人的意见是适可而止,因为时间太短了,无论你怎么做你都无法了解完整。即然无法了解完整,那就获取你最需要的吧,就是本文开头的那三个问题,以及上面所述的“第三点”(了解应聘者的以往经历)。

也许这个文章中有一些你不同意的观点,没问题,欢迎批评,如果你有更好的做法,我也想听听,不妨在这里留个言,如果不想留也可以email给我。

(全文完)

来源:酷壳

懒人版

cdr格式

文件校验信息

1
2
3
4
5
6
7
名称: OS X El Capitan 10.11.3 (15D21) Lazy Installer.cdr
大小: 8000032768 字节 (7629 MB)
CRC32: 879D014C
CRC64: 16AA4DD28C00B896
SHA256: 7E37A068FE39CAACA831513515369E71A7EC1E84161338DF855DF02FB69FEBB4
SHA1: 030BCBF5A2B147B898C0D881517C6F2C99B13E30
BLAKE2sp: DD074E91757C86C2E9152A14BD42D80EB4D78F0D1E5B84308A1361C262DB51D3

以App Store下载的原版安装包Install OS X El Capitan.app 制作,为能安装到MBR硬盘上,仅替换了OSInstall.mpkg和OSInstaller,另外在Extra文件夹加入了变色龙引导和常用的第三方驱动,可根据需要增减.

下载地址

百度云(低速) 密码: juk4

请用硬盘安装助手先恢复到硬盘的一个大于8G的、未格式化的分区用于安装(具体方法自己搜教程):

OS X El Capitan 10.11.3 15D21原版安装包镜像

App Store下载的OS X El Capitan 10.11.3 15D21原版安装包Install OS X El Capitan.app的镜像

文件校验信息

1
2
3
4
5
6
7
名称: Install OS X El Capitan 10.11.3 15D21.dmg
大小:5.78GB
CRC32: E8FD2C7B
MD5: 80C5702AF3DEF49DFFEA390C390A0709
SHA-1: FFC8593886DA7CB31F7AB4A4EA1006AE05B80570
名称: Install OS X El Capitan.app/Contents/SharedSupport/InstallESD.dmg
MD5: 24c74acc4779b32a01024348c00892dc

在OS X中双击加载Install OS X El Capitan 10.11.3 15D21.dmg,里面的Install OS X El Capitan.app就是App Store下载的OS X El Capitan 10.11.3 15D21原版安装包,绝对原版!

下载地址

百度云(低速) 密码:uswh

带Clover 3330引导的OS X El 10.11.3 15D21原版安装U盘镜像

请看论坛原帖

开源

本软件已开源,请自行修改及完善功能。QQ群:198889192
本项目由于网站改版以及个人时间原因停止继续开发,不过大家有兴趣可以发pull request,共同继续完善功能。

项目地址https://github.com/wudimenghuan/HeidaStudy

说明

从2012年10月开始,黑龙江大学网络课学习管家(网络课学习助手)已经发布6个版本了,希望大家多多支持STX8.COM!

如果有课程需要添加,或有什么建议或意见,请加QQ群:198889192

注意事项

如果出现一直显示时间更新出错的问题,需要先登录一下平台,再退出平台,然后再用软件

使用过程中不要登录平台

文件校验信息

SHA1、SHA256等文件校验信息在Readme.txt中,可使用PGP检查签名。

我的PGP公钥 (PGP Public Key)

下载地址

请到github上获取院代码,自行编译

更新日志

V3.8.4

  • 支持大学体育

V3.8.2

  • 支持2015秋季课程

V3.7.1

  • 合并3个版本

V3.7.0

  • 重写界面,优化流程

V3.6.3

  • 添加几个未添加的安全教育老师

V3.6.2

  • 加入2014秋安全教育课程支持

V3.6.1

  • 修复绿屏BUG

V3.6

  • 修复2014秋形势任务教师未标记问题

V3.5

  • 2014秋季学期

V3.4

  • 2014春季学期

V3.3

  • 修复打不开的问题
  • 使得程序支持Windows所有系统

V3.2

  • 修复界面无法显示的bug

V3.1

  • 2014春季学期支持

V3.0 Beta 公测版

  • 加入总进度条
  • 加入用户密码验证功能

V2.9 正式版

  • 修复bug

V2.9 内测版

  • 加入2013年春季学期课程

V2.5 正式版

  • 增加总时间功能

V2.4 正式版

  • 更改时间显示一直占用内存导致内存不停增长的问题

V2.3 正式版

  • 加入更多网络课,网络课已经完全加入

V2.2 正式版

  • 修复S3加速功能为稳定加速

V2.1 内测版

  • 时间显示加入进度条

V2.0 内测版

  • 增加更多网络课支持

V1.9 预览版

  • 更改界面布局
  • 增加提示

V1.8 预览版

  • 使提示更清晰、明确
  • 修复关闭不完全导致弹出的关闭程序窗口

V1.7 内测版

  • 加入网络课支持

V1.6 内测版

  • 修复2倍时只有1倍的问题
  • 修复窗口拖动bug

V1.5

  • 时间显示功能
  • 合并上下两个版本
  • S3超级加速功能(不稳定)

V1.4 内测版

  • 速度提升,超越4倍

V1.3 正式版

  • 去掉课程号,改为选择老师
  • 课程选择功能实现
  • 修复速度调整bug

V1.2 正式版

  • 速度调整功能完成

V1.1 体验版

  • 完成基本功能,可实现无人值守自动挂机

Linux笔记

内容:主要讲解常用命令

2015年12月

时空

Linux概述

Linux的内核版本

38页1.2.5

Linux发行版

目前Linux主要分为两大分支:

  • Debian

  • 使用dpkg方式安装软件,包括Debian, Ubuntu(Linux Mint)

  • 全球最高份额,deb包非常方便

  • deb包

  • sudo dpkg -i 软件包

  • sudo dpkg -r 软件名

  • Red Hat

  • 使用RPM方式安装软件,包括Red Hat(CentOS), Fedora, SuSE

  • 只有中国份额较高。因为进入中国比较早,很多人不愿意换

  • rpm包

开源许可证

45页1.3.3

Linux的安装

开机流程

两种启动方式:BIOS和UEFI

  • 以前:BIOS启动

  • 对应MBR磁盘,MBR分区表

  • 只有4个主分区

  • 现代:UEFI启动

  • 对应GPT磁盘,GUID分区表

  • 无限主分区

  • Mac默认使用GPT

MBR方式开机流程

72页3.2.4

磁盘分区

初学:在硬盘尾部安装,全部使用逻辑分区

挂载点 容量 格式
/ 剩下的空间 ext4
swap 与内存大小相同 swap

正常:

挂载点 容量 格式
/boot 100M ext4
/ 相当于系统盘 ext4
/home 剩下的空间 ext4
swap 与内存大小相同 swap

常用命令

X Window热键

X Window与文字模式的切换:[Ctrl] + [Alt] + [F1]~[F6]

重启X Window:Ctrl+Alt+Backspace

基础命令和热键

列出文件

1
2
3
$ ls
$ ls -l
$ ll # Ubuntu可以用

显示日期与时间

1
$ date

日历

1
2
3
$ cal
$ cal 2015
$ cal 12 2015

计算器

1
$ bc

热键

  • Tab 命令补齐、文件补齐
  • Ctrl+C 停止程序
  • Ctrl+D EOF、离开

在线求助

1
$ man 要查询的命令

超简单文本编辑器:nano

1
$ nano test.txt

数据同步写入磁盘

1
$ sync

关机

1
# shutdown -h now

重启

1
2
# reboot
# shutdown -r now

切断电源(不建议)

1
# halt

切换执行等级:init

1
2
# init 0 # 关机
# init 6 # 重启

设置当前用户的密码

1
$ passwd

Linux文件操作

Windows中的文件夹在Linux中叫目录。

特殊的目录
. 代表此层目录
..代表上层目录
- 代表前一个工作目录
~ 代表当前用户主目录
~account 代表account这个用户主目录

目录相关操作

切换目录:cd

1
$ cd [相对路径或绝对路径]

显示当前目录:pwd

1
$ pwd

新建目录:mkdir

1
$ mkdir test # 新建一个名为test的目录

删除空目录:rmdir

1
$ rmdir test

环境变量:$PATH

使用echo显示$PATH

1
$ echo $PATH

文件操作命令

查看文件与目录:ls

1
2
3
$ ls
$ ls -l
$ ls -al

复制:cp

1
$ cp 源文件 目标文件

删除:rm

1
2
$ rm 文件或目录
$ rm -r 递归删除,删掉目录中所有文件和目录

移动、重命名:mv

1
$ mv 源文件 目标文件

文件内容查阅

直接查看一个文件的内容:cat

1
$ cat test.txt

反向查看:tac

1
$ tac test.txt

添加行号打印:nl

1
$ nl test.txt

翻页查看:more

1
$ more test.txt

上下翻页查看:less

1
$ less test.txt

只看前面几行:head

1
2
$ head test.txt # 默认10行
$ head -n 20 test.txt

只看后面几行:tail

1
2
$ tail test.txt
$ tail -n 20 test.txt

查看非纯文本文件:od

1
$ od test.txt

修改文件时间或创建新文件:touch

1
2
3
$ touch new.txt # 创建一个名为new.txt的文件
$ touch -d "2 days ago" test.txt
$ touch -t 1512251200 test.txt

查看文件类型:file

1
2
3
$ file test.txt # ASCII text
$ file /usr/bin/passwd
$ file /var/lib/mlocate/mlocate.db # data

文件的查找

188页7.5.2

寻找执行文件

1
2
$ which ifconfig
$ which cd

在数据库中寻找特定文件:whereis, locate

1
2
$ which test.txt
$ locate test.txt

扫描硬盘查找:find

1
2
3
4
$ find [PATH] [option] [action]
$ find / -user root
$ find / -name passwd
$ find / -mtime 0

Linux目录配置标准:FHS

152页

可分享的(shareable) 不可分享的(unsharealbe)
不变的(static) /usr (软件放置处) /etc (配置文件)
/opt (第三方软件) /boot (开机与内核文件)
可变动的(variable) /var/mail(用户邮件信箱) /var/run (程序相关)
/var/spool/news(新闻组) /var/lock (程序相关)

Linux的文件权限

用户与用户组

139页6.1

文件所有者,用户组,其他人

root是万能的

查看文件权限

1
$ ls -al

文件类型与权限

可读、可写、可执行

1
2
-rwxrwxrwx 4 root root 4096 Sep 8 14:06 test.txt
drwxrwxrwx 9 root root 4096 Jan 6 10:57 hello

文件权限 连接数 文件所有者 文件所属用户组 文件大小 修改时间 文件名

文件权限分为文件类型和3组权限

  • 文件类型

  • d表示目录

  • -表示文件

  • l表示连接文件

  • b表示接口设备

  • c
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    表示串口设备



    - 3组权限

    - 第一组:文件所有者的权限

    - 第二组:同用户组的权限

    - 第三组:其他非本用户组的权限

    > 142-144页例题练习

    ### 改变文件属性与权限

    改变所属用户组:chgrp
    # chgrp root test.txt
    1
    2

    改变文件所有者:chown
    # chown root:root dir
    1
    2
    3
    4

    chown -R 表示递归

    改变文件的权限:chmod
    $ chmod 777 test.txt $ chmod 755 test.txt
    1
    2
    3
    4
    5
    6
    7
    8

    - `r`:4
    - `w`:2
    - `x`:1

    > 146页例题

    符号类型改变权限
    $ chmod u/g/o/a +/-/= r/w/x 文件或目录 $ chmod u=rwx,go=rx test.txt $ chmod a-x test.txt $ chmod a+w test.txt
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39

    不要随便用chmod的递归

    ### 目录与文件的权限意义

    权限对文件的重要性

    - `r`: 可读取
    - `w`: 可编辑、新增、修改,不包括删除
    - `x`: 可执行

    权限对目录的重要性

    - `r`: 可读取(可以列出)
    - `w`: 可写入
    - 新建新的文件与目录
    - 删除已经存在的文件与目录
    - 重命名
    - 转移该目录内的文件、目录位置
    - `x`: 可进入

    > 148-149页例题

    ### Linux文件种类

    - 普通文件(regular file): `r`
    - 目录(directory): `d`
    - 连接(link): `l`
    - 设备(device)
    - 块(block)设备: `b`
    - 字符(character)设备文件: `c`
    - 套接字(sockets): `s`
    - 管道(FIFO, pipe): `p`

    ### 文件的默认权限与隐藏权限

    > 180-181页例题

    默认权限:`umask`,在原权限基础上减去权限
    $ umask #查看 $ umask -S $ umask 002 #设置 $ umask 022
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    隐藏属性:略(自学)

    > 183页7.4.2
    > 设置文件的隐藏属性:`chattr`
    > 查看文件的隐藏属性:`lsattr`

    ### 权限相关习题

    > 194页情景模拟题

    ## Linux文件系统

    ### 磁盘与目录容量

    > 210页8.2.1

    列出文件系统的整体磁盘使用量:`df`
    $ df -h
    1
    2

    评估文件系统的磁盘使用量:`du`
    $ du $ du -a # 同时列出文件容量 $ du -sm # s: 只列出总量 m: MB
    1
    2
    3
    4

    ### 连接文件:ln

    hard link(硬链接或实际连接)
    $ ln /etc/crontab . $ ll -i
    1
    2
    3
    4
    5

    - 无法做“目录”的链接
    - 删掉其中一个,另一个可用

    symbolic link(符号连接)
    $ ln -s /etc/crontab crontab2 $ ll -i /etc/crontab ./crontab2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    - 相当于Windows的快捷方式,删除源文件会不可用

    ### 磁盘的分区、格式化、检验与挂载

    略(自学)

    ## 压缩与打包

    ### 单一文件压缩命令

    gzip, zcat
    $ gzip file $ zcat file.gz $ gzip -d file.gz
    1
    2

    bzip2, bzcat
    $ bzip2 -z file $ bzcat file.bz2 $ bzip2 -d file.bz2
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    ### 打包命令:tar

    打包同时可以压缩,tar的参数:

    `-z`: gzip方式压缩/解压缩
    `-j`: bzip2方式压缩/解压缩
    `-c`: 新建打包文件
    `-x`: 解打包或解压缩
    `-v`: 显示过程
    `-f`: 跟要被处理的文件名
    `-p`: 保留原本权限与属性

    打包
    $ tar -zcvf dir.tar.gz dir $ tar -jcvf dir.tar.bz2 dir $ tar -cvf dir.tar dir
    1
    2

    解包
    $ tar -zxvf dir.tar.gz $ tar -jxvf dir.tar.bz2 $ tar -zxvf dir.tar.gz -C /tmp
    1
    2

    备份
    # tar -zpcvf etc.tar.gz /etc # tar -jpcvf etc.tar.bz2 /etc
    1
    2

    查看
    $ tar -ztvf dir.tar.gz $ tar -jtvf dir.tar.bz2
    1
    2
    3
    4

    ## vim编辑器

    ### 进入vim
    $ vim 文件名
    1
    2

    ### 新建文档
    $ vim 新文件名
    1
    2
    3
    4

    不保存则不生成新文件

    ### 进入插入模式
    i, I, a, A, o, O
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    `i`光标位置插入
    `I`行首插入
    `o`当前行后插入新行
    `O`当前行前插入新行
    `a`光标位置后插入
    `A`行末尾插入

    ### 行号

    显示行号
    :set nu :set number :set nonu :set nonumber
    1
    2

    不显示行号
    :set nu :set number :set nonu :set nonumber
    1
    2

    ### 跳转
    :数字 数字G
    1
    2
    3
    4

    最后一行`G`

    ### 删除行、剪切
    dd 数字dd
    1
    2

    ### 复制行
    yy 数字yy
    1
    2

    ### 粘贴
    p
    1
    2

    ### 块选择
    Ctrl+v
    1
    2
    3
    4

    ### 预设行号

    编辑`~`下的.vimrc文件,写入
    set nu

这个东西是书上看到的,集成环境,不错。

下载了一个XAMPP的安装版,先要点setup的脚本,然后运行control

但是Apache还是起不来,不知道为什么

错误:

18:55:49 [Apache] Status change detected: running

18:55:50 [Apache] Status change detected: stopped

18:55:50 [Apache] Error: Apache shutdown unexpectedly.

18:55:50 [Apache] This may be due to a blocked port, missing dependencies,

18:55:50 [Apache] improper privileges, a crash, or a shutdown by another method.

18:55:50 [Apache] Press the Logs button to view error logs and check

18:55:50 [Apache] the Windows Event Viewer for more clues

18:55:50 [Apache] If you need more help, copy and post this

18:55:50 [Apache] entire log window on the forums

img

后来发现是因为80端口被占了,解决方法是点Apache的Config,把所有80改成81,然后XAMPP的管理的Config里也要改成81端口。

img

但是Tomcat能启动,但是点左面的红叉装上服务之后就不能启动。

所以应该是装不上服务。

mysql默认root用户没有密码,输入mysql –u root 进入mysql

1、初始化root密码

进入mysql数据库

1
mysql>update user set password=PASSWORD(‘123456’) where User='root';

2、允许mysql远程访问,可以使用以下三种方式:

a、改表。

1
2
3
4
mysql -u root –p
mysql>use mysql;
mysql>update user set host = '%' where user = 'root';
mysql>select host, user from user;

b、授权。

例如,你想root使用123456从任何主机连接到mysql服务器。

1
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

如果你想允许用户jack从ip为10.10.50.127的主机连接到mysql服务器,并使用654321作为密码

1
2
mysql>GRANT ALL PRIVILEGES ON *.* TO 'jack'@’10.10.50.127’ IDENTIFIED BY '654321' WITH GRANT OPTION;
mysql>FLUSH RIVILEGES

c:在安装mysql的机器上运行:

进入MySQL服务器

1
d:\mysql\bin\>mysql -h localhost -u root

赋予任何主机访问数据的权限

赋予任何主机访问数据的权限

1
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION

使修改生效

1
mysql>FLUSH PRIVILEGES

退出MySQL服务器

1
mysql>EXIT

转自博客园

中国女孩亲历美国教育:美国高中的英语课怎么上?一位土生土长的中国女孩,也一定能够以自己的方式,读懂西方文学巨匠们的“自白”。中美教育的区别,天上地下啊。

我在美国高中的第二年,也是高中最后一年,终于和同年级的同学坐进了同一个英语课堂。私立高中的英语课和美国大学英语课设置类似,同一等级的课程分成很多专题,学生可以根据兴趣自己选。莎士比亚、战争文学、存在主义、诗歌和小说写作……一眼扫下来,若不是亲眼在课表上看到,很难相信这是高中英语教授的内容。

害怕自己眼大肚子小,我选了一门看上去比较浅显的主题为“文学中的物质主义”的课程,老师是我宿舍楼层的舍监(很多美国私立高中的老师和学生一起住在宿舍),有个七八岁一头金毛的可爱儿子,平时总是笑眯眯的。然而在开课前,学校临时发现她的课程时间排不进我的课表,于是将我分到另一门课里。课时是每天下午让人昏昏欲睡的第六节,课名叫做“自白式记叙”。

在Deerfield的两年,与跟在美国求学的这七年一样,令我最难忘的经历总是来得阴错阳差,而经历的过程常常有如一场艰难的长跑,站在起点时往往并不会带着欢欣鼓舞的心情。
第一天的课程结束后,我找到老师,告诉他我一点都没听懂他关于詹姆斯·乔伊斯作品的讲解,然后沉默地等着他开口,劝我换到别的班级。

Dr. Driskill有一头花白的头发和雪白的络腮胡,年龄似乎在五六十岁,具体岁数难以估计。他摘下眼镜,看着我静静思考了一会儿。“我晚上会在英语教学楼一层的大书房看书,”他若无其事地说:“我们可以聊聊。”

晚上八点钟,我来到英语教学楼,大书房的门半开着,高高的天花板下,棕红色木壁前悬挂着一圈历代校长的画像。Dr. Driskill坐在房间正中央一张长木桌的尽头,看到我微微点了点头。

“去年在ESL(English as Second Language,英语为第二语言)你都读了些什么书?”
我一本本地列出来。有《杀死一只知更鸟》、《麦田里的守望者》、《紫色》、《老人与海》等。在英文文学里,每一本都以文字简明出名。而这学期Dr. Driskill课表上的书则艰深晦涩,又带着浓重的时代背景,似乎每一本都是这些书的反义词。

听了这个单子以后,Dr. Driskill出乎意料地看上去很满意。用不疾不徐的语速,他开始解释这学期要读的书:乔伊斯的《一个青年艺术家的自画像》的主人公其实和《麦田里的守望者》中的霍尔顿带着类似的困惑,都是渴望能够挣脱身边生活禁锢的年轻人;康拉德的《黑暗之心》和《老人与海》一样,描述的都是主人公为了追寻某物而踏上的遥远征程;莫里森的《宠儿》则反映和《紫色》类似的社会话题:美国历史上的黑人在社会歧视下做出的挣扎;《洛丽塔》,他顿了顿,可能是唯一一部比较大的阅读挑战,不过——我至今记得他的表情,双眼微微瞇着,好像单提到小说的名字就把他拉回到了那些令他着迷的词句间——“太值得一读了”。

第二天,我回到了Dr. Driskill的课堂,或许是由于他对我的“阅读恐惧”漫不经心的态度,或许是由于他在文学作品中的牵线搭桥使那些“面目狰狞”的书变得不再高不可攀,或许还有其他说不清的原因。总之,在那个学期的每天下午两点钟,在英语教学楼的二层的一张圆桌旁,我和十几位同学一起穿越时间和空间,窥探了一位又一位英文作家私密而引人入胜的“自白式记叙”。

美国私立学校的英文教学或许相当于中国高中的“语文课”,不过两者的形式和内容则天差地别。Deerfield的英语课是由老师带领的圆桌讨论,以整本书作为教学单位,比起就书论书,更注重教会学生如何做有鉴别力的读者,和文字保持一定距离,学会分析各种文学技巧,从自己的立场欣赏或批判作者的写作手法。

Dr. Driskill带着我们分析一本书,如同在用天文望远镜和显微镜快速切换着轮流审视作品。时代背景、作者生平和文学流派的介绍为我们勾勒出理解作品的大框架,逐字逐句的审读和关键词的分析帮助我们理解作者字里行间的艺术。一节课有时一扫几百年的美国历史,有时辩论几句对白中体现的人物性格,很有大学课堂不拘一格的风格,一路听下来非常过瘾。

而考试的形式往往是建立在整本书之上的当堂小论文,不会为平时的课堂教学加上框框,因此一本书十位老师可以教出十种风格,而同一位老师每一年的授课内容也会根据自己的心得调整,不尽相同。如同俗话说的:“一千个读者眼中,有一千个哈姆雷特。”

中国的语文课堂以课文为单位,老师习惯指出大纲上列出的词句,带领学生按部就班地分析:我记得在北京高中时,老师曾花了半节课的时间为我们讲解《孔乙己》的最后一句,应该如何理解“大约孔乙己的确死了”中“大约”和“的确”的冲突。所问的问题也大多已经暗示着标准答案的方向,比如:“孔乙己的悲剧反映了当时封建科举制度怎样的特征?”

而Dr. Driskill的课堂上则是另一种风景。他常常在每节课开头随意问:“那么,大家对上一周的阅读感觉如何?”然后靠回椅子里,听学生七嘴八舌的看法。讨论如同前行的船只,由学生的兴趣和临堂辩论产生的激流推进,而老师仅偶然抛出几句评论来推动讨论,使船只不至于偏离航道太远。

Dr. Driskill从不害怕提出一些对十六七岁的学生听来高深抽象,无边无际的问题。在讲解《一个青年艺术家的自画像》时,他鼓励我们探讨“主人公对艺术的看法和对宗教、家庭、学校、祖国的看法有哪些区别?为什么他会在艺术中寻求解脱?”他也从不避讳听上去有些离经叛道的问题:“《洛丽塔》整本书是否包含了任何道德教训?作者有没有打算通过这本书传达任何道德教训?”

久而久之,虽然读书仍要翻着字典,我对这些问题慢慢不再惧怕,也不太担心自己答案的片面和幼稚,毕竟最终的答案总是在大家的你一言我一语当中慢慢成形,而许多问题最后总是没有答案的。

尽管每次的阅读只有短短几十页,课堂上几十分钟的讨论却往往不能穷尽其中丰富的内涵。于是,在每周二Dr. Driskill晚上在宿舍值班的时候,我常常造访,在一栋低年级男生宿舍楼一层的公共客厅里,周围十四五岁男孩打闹嬉笑声中,和他继续探讨课上没有聊完的话题。

在这些谈话中,我和Dr. Driskill有时会跃过书本,聊到各自的生活。他是爱尔兰裔美国人,大学上到一半,征兵被征到了越南战场上,曾在那里担任了好几年飞行员。回到美国后,在加州伯克利大学读了文学博士,开始了当老师云游四方的生活,在意大利、香港、日本、西班牙的国际学校都曾当过英语老师。或许也正因为这个原因,他为我们布置的阅读书籍中,有爱尔兰裔代表作家乔伊斯,有以写越战小说出名的Tim O’Brien,也有几位以英语作为第二甚至第三外语创作的作家。

正如在课堂上,我学着在每本书的语句和片段中捕风捉影,揣摩作者的意图,通过Dr. Driskill布置的书籍,也可以阅读出他的思考、信仰和一生的阅历,以及一些他从不愿开口谈起的回忆。

最后一节课,Dr. Driskill背着吉他,拿着一罐雪碧来到教室。“其实我根本不爱喝汽水,”他干笑了一声,啜了一口雪碧润润嗓子,拨动琴弦,开始演唱他为越战当中死去的士兵兄弟们创作的歌曲。教室安静得出奇,只有窗外树叶沙沙的响声。我努力捕捉他的歌词,但在吉他的伴奏下,很难听懂。甚至比第一节课上,他关于詹姆斯·乔伊斯的讲解还难听懂。
然而我仍满心感激。Deerfield是我所接触过校规最严格的学校,生活中处处是条条框框。然而在课堂上,学校却给予学生完全的信任,天高任鸟飞,相信不谙世事的我们也可以吸收文学世界中的精华。

对我的自我怀疑,Dr. Driskill漫不经心的态度如同一支镇定剂,因为他也同样相信,哪怕借着磕磕绊绊的英语,一位土生土长的中国女孩也一定能够以自己的方式读懂西方文学巨匠们的“自白”;而通过这些文字,以及他的琴声歌声,她也能够理解一位足迹遍布世界的越战老兵的“自白”。

或许正如同他说的,这一切都“太值得一读了”。

高雨莘是自由撰稿人,现居北京。

来源:纽时中文

To sound like a Brit, you’ll need a “flexible tongue tip,” and for that you must exercise, says Barbara Berkery, a dialect and voice coach currently tutoring Geoffrey Rush on the Queensland set of the fifth “Pirates of the Caribbean” film.

口音和发音教练芭芭拉·伯克里(Barbara Berkery)说,想说一口英音,得有个“灵活的舌尖”,只有通过练习才能实现。目前,她在《加勒比海盗》(Pirates of the Caribbean)第五部的昆士兰片场指导杰弗里·拉什(Geoffrey Rush)。

Americans have particularly lazy tongue tips. When Berkery is training an actor in a British accent, she starts with a tongue boot camp of silent flicks and twists. There is a physicality to speech we prattling adults often overlook.

美国人的舌尖特别懒。伯克里训练演员说英音时,先集中训练他们的舌头无声地快速移动和扭动。我们喋喋不休的成年人经常忽视说话方式中的身体性层面。

“Babies learn to speak by watching us making shapes at them from their crib,” says Berkery, who advises her clients to similarly study mouths while watching videos of politicians, like David Cameron, who have perfected the British accent that linguists call “Received Pronunciation.”

“婴儿学说话是从躺在襁褓里看大人的口型开始的,”伯克里说。她建议客户用类似的方法学习口型,比如观看政客的讲话视频,比如戴维·卡梅伦(David Cameron)的英音就达到了语言学家们所说的“标准发音”。

BBC programs are also good primers. Americans speak with wide, almost grinlike mouths. British speech requires a dropped jaw and vertically open lips. (Imagine you are blowing kisses and then say the word “swan.”) Clearly enunciate consonants. Don’t, for example, say T’s as D’s (it is “butter,” not “budder”). “That’s a very American thing,” Berkery says. You should hear the full T at the end of “cat.”

BBC的节目也是很好的范本。美国人讲话时嘴咧得很开。讲英音则需要把下巴往下拉,嘴唇竖着张开(想像着你在飞吻,然后念出“swan”这个单词)。辅音要发得很清楚。比如,不要把“T”发成“D”(不要把“butter”念成“budder”)。“那是典型的美式发音,”伯克里说。说“cat”的时候,末尾的的“T”要念得很完整。

Illustration by Radio

Practice British consonants and vowels with repetitive ditties, like “Ten tiny typists tripped through the tunnel”; after that, graduate to reading whole chapters of British novels aloud. Don’t run words together as Americans do. Instead, each word needs what Berkery calls an “infinitesimal space” around it, which will make you speak more slowly.

接下来,用绕口令练习英语辅音和元音,比如“Ten tiny typists tripped through the tunnel”;之后大声朗读整章英文小说。不要像美国人那样把单词连在一起念。而要像伯克里说的那样,在每个单词前后留出“无限短的停顿”,这样你说话会慢一点。

At a certain point, go undercover. Berkery trained Renée Zellweger to sound British for her role in the movie “Bridget Jones’s Diary.” Before filming started, Zellweger used an alias to get a temp job at a London publishing house where everyone assumed she was British. Order at a restaurant or ask to try on clothes in a department store in your new patois. “Use the accent with strangers, otherwise you’ll never get it,” Berkery says. Practice until nothing can jar you out of it, not even a sex scene or a close call with an oncoming taxi.

到了某个阶段,就可以像卧底一样实战演习了。蕾妮·齐薇格(Renée Zellweger)拍《BJ单身日记》(Bridget Jones’s Diary)的时候,伯克里也帮她练过英音。拍摄开始前,齐薇格用化名在伦敦一家出版社做临时工,那里的人都以为她是英国人。用你的新口音在餐馆点餐,或者在商场要求试衣。“用这种口音跟陌生人说话,否则你永远也无法掌握它,”伯克里说。不断练习,直到口音在任何情况下都不会改变,就算做爱或者匆忙叫住迎面而来的出租车时也一样。

Get good enough, and eventually you will be able to slip effortlessly into the accent. “It should be second nature to you,” Berkery says.

好好练习吧,最后你一定能轻松转换成那种口音的。“它应该变成你的第二本能,”伯克里说。
本文最初发表于2015年5月10日。

翻译:王相宜

来源:纽时中文

昨天,一篇呼吁抵制新国货小米的文章,在网上流传。这篇文章,总结起来,其实很简单,那就是:小米的低价,获得了消费者,在消费者量的支持下,就有能力与上游厂家谈判,会伤害上游产业的利润,而上游的研发又需要大量资金。所以,小米的低价通过侵蚀上游利润的方式,最终会损害整个电子芯片产业。

这个结论是错误的。

首先,文章对市场的认识是错误的。

在一开始,文章以Uber为例子,指责Uber伤害到交通行业。不过,市场是动态的,只要司机、车、消费者的需求还存在,没有滴滴与Uber,市场中还会有新的模式出现。与此同时,市场的动态变化也是缓慢的,不会出现Uber或滴滴一夜之间就倒掉,交通行业天下大乱的情况。如果说,滴滴与Uber的系统可能会一夜之间崩溃,那么,同样的,出租车司机也会在一天之内举行罢工。甚至,即使出现这种情况,也不要紧,北京的黑车司机在自己车上挂的红色小灯,已经告诉我们市场会怎么来应对这种情况。

所以,文章中所谓的滴滴与Uber控制交通行业,既是静态地看待市场,认为市场无法变化以适应新情况,同时又认为整个市场会一夜之间彻底颠覆。这既在逻辑上是自相矛盾的,又是不可能出现在现实之中的。

更何况,市场是细分的。现在既有Intel至强CPU,8核16线程,价格1万元左右,也有双核CPU,价格仅仅200元。在手机市场,既有小米,也有苹果。所以,只要有需求,不用担心卖不出好价钱。

其次,文章也不了解科技史。

从20世纪60年代中,到现在为止,计算机芯片行业的发展规律都符合摩尔定律。摩尔定律是Intel创始人之一戈登·摩尔(Gordon Moore)提出来的。其内容为:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。换言之,每一美元所能买到的电脑性能,将每隔18-24个月翻一倍以上。更简单的说,同样性能的电脑,会越来越便宜。60年代中期IBM耗资50亿研制的IBM360系统,按计算能力计算的话,现在只值3美分。

实际上,芯片行业、电子行业的巨头们,从来不害怕这个趋势,相反,他们积极利用这个趋势。在90年代末,Intel就力推低价电脑,试图把价格降到600美元以下,在21世纪初,这个价位进一步降到200-250美元。当年,OLPC积极策动“一百美元笔记本”,英特尔则在印度、墨西哥推动Community PC,在中国,主要与海尔推动农村电脑。2007年,Intel与中国政府联合推广Classmate PC,价位在200美元,以帮助中国基层教师与学生用上电脑。

著名的松下电器的创始人,松下幸之助的理念则是,“把大众需要的东西,变得像自来水一样便宜。”除了上游产业迎合这个趋势,在下游中,康柏、DELL、神舟都以低价闻名,并由此具备向上游厂家的价格谈判能力。显然,它们不但没有损坏整个PC行业,反而极大地发展了PC行业。

难道,芯片行业与电子行业巨头对低价的观念与实践,不足以说明低价并不是行业的死敌,而是行业的利器吗?这背后的原理就是低价带来更大规模的使用人群,利用规模效应,来抵消价格下降,获得更大的利润。

既不了解市场,又不了解科技史,那么,必然的一个结果就是,不了解价格在科技市场中的作用,不懂成本、利润,价格的信号传递与资源配置作用。实际上,价格是一种信息机制,它反映了消费者的需求,把需求传递给上游的资源分配,进而调节行业的发展方向。

根据摩尔定律,当价格不变时,约每隔18-24个月,性能也将提升一倍。反过来说,如果消费者所需要的手机性能,没有18个月翻一番,那么,价格必然保持不住,会越来越便宜。

在手机领域,目前,手机性能的提升,受限于电池等环节,已经变缓。苹果6能玩的游戏,苹果5也能玩;三星S6能使用的APP,放到S4甚至S3上一样运行。既然如此,消费者购买更强性能手机的需求就降低了,手机厂家采购更强芯片的动机也降低了。所以,从这个意义上说,小米的存在,是通过消费者对手机性能与价格的抉择,把市场对行业发展的方向选择传递给上游厂家。

这个趋势在科技史并不是第一次出现。

在上世纪90年中,出现了第一代3D显卡。3DFX公司的Voodoo与其后NVIDIA公司的riva128,需要1000元,还需搭配较好的CPU与内存配置。而现在,一般人使用的显卡只需要500元。除了摩尔定律的作用外,另一个原因就是显卡的3D能力,已经逐步超过消费者的需求——在1080p的屏幕上实现每秒40帧,已经不需要太好的显卡。于是,通过价格机制,需求传递到上游厂家,资源被投向CPU领域,投向移动领域。

不过这个状态即将改变。最近,被微软收购的Oculus Rift以及三星等厂家的虚拟现实头盔,逐渐成为热点,可以预见的是,消费者对显卡的3D能力需求,会迅速地提升。因为在虚拟现实中,需要同时渲染左右眼两幅画面,为了不产生眩晕,帧率也要求更高,这都提出对显卡更高的要求。而且,在虚拟现实中,浸入感、真实感会要求更高的特效水平,比如更真实的毛发运动,更真实的光线效果,更真实的物理效果。这就意味着,对消费者来说,显卡3D能力的边际效用提高了,消费者就会愿意承担更高的边际成本,于是,消费者会提高显卡的预算。而在此之前,为什么要那么好的显卡呢?

所以,价格机制,反映了消费者、市场对技术方向的选择。

在真实市场中,众多公司在市场中竞争、试错,以适应消费者的需求。这种机制的代价是极大的,有巨大的研发投入收不回来,项目失败,甚至公司破产。计划经济者,对这些浪费从来都是深恶痛绝的。

在作者观念中,创新是一种计划经济的、占有道德高点的行为,下游应该为上游贡献,这类计划经济观的类似表述,中国人可谓耳熟能详。比如,国家投了那么多钱,搞了一个某某标准,不能浪费,所以,一定要上自己的标准,一定要禁外国的标准。这个主语是国家。当然,那篇文章不好意思用国家当主语,更不可能用资本家当主语,但主语换做“上游厂家”,虽然更加迷惑人,但终究本质是一样的。那么,北斗同样用了这么多钱,手机厂家是应该为了低价格,不要这个芯片呢,还是政府为了保持上游厂家的利润而强行摊派这个芯片呢?如果不考虑北斗的利润,消费者为什么要考虑高通的利润呢?

实际上,如果高通破产了,正是市场机制的优点,而非缺点,证明了高通的方向,不符合科技行业未来的发展方向。科技史中,不乏类似案例。为了在计算机技术上赶上和超过美国,1981年,日本雄心勃勃,以政府为主导,开始研制第五代计算机。与此同时,PC系统与网络化在美国兴起。十年后,在耗资4亿多美元之后,日本政府不得不终止该计划。

与计划经济观念不同,市场经济观念认为,这些浪费,是技术发展的必要过程。从这个角度,文章更深层次的缺陷在于,缺乏对市场经济机制的了解。作者以高端产业链的利润为理由,批评下游产业,这看起来是为了科技市场的健康与可持续发展。实际上,文章的思想底色却是苏联式的创新模式与工业模式,本质上是计划经济的底色。

文章引用美国知名学者麦克尔·R. 所罗门的《消费者行为学》里所谓成熟消费者的概念,认为“社会公民,了解企业采用这些战术的消费者行为基础,也有助于我们在必要的时候,呼吁政府适时采取措施,限制那些有损我们利益的企业行为”。

或许我孤陋寡闻,不知道什么所谓的消费者道德,但我知道,自私自利的经济人是现代经济学的基石,在这个基础上,建立起了整个现代经济学的大厦与市场经济。而另一句堪称经济学基础的名言也告诉我们:“我们所需的一日三餐,不是来自屠夫、酿酒家或面包师的施舍,而是来自他们为了自己利益的打算。”

所以,买小米,使用Uber与滴滴专车,都没问题,只要你能从中得到好处。那么,这就注定对芯片行业,对交通行业,没有任何伤害,相反,会使那些陈旧的、落伍的,或者不该深入的行业方向被淘汰掉。

来源:腾讯

按:这几天我一直在写这篇东西,本来是胸有成竹,没想到后来越写越发现自己在这个题目下有太多话想说,而以我现在的能力又不能很好地概括总结,以至于越写越长,文章结构也变得混乱,到后来修改的时候每次都要考虑好久才能下笔,所以决定拆成两部分来发,以便阅读。这篇写得我心力交瘁,质量不算好,凑合着看吧。

同样是写程序,不同的岗位工作内容不一样,对程序质量以及工程师的要求也不一样。程序开发大概可以划分成两类:开发和研发,相应也就有开发工程师和研发工程师。很多人觉得做开发和做研发没什么区别,“都是一样对着电脑写程序啊”,但其实这两者是完全不一样的,下面我想抛开公司对员工的期望、社会对工程师的需求等其它因素,单纯从国内互联网行业“工程师个人发展”的角度来说一下我个人对这两类工作的看法。

开发

开发一般是指产品开发,开发工程师直接为产品贡献代码。每个公司都有自己的产品线,拿 Google 来说吧,它有 Gmail, Chrome 等产品,每个产品都有很多开发工程师在后面支持,这些产品的开发、维护以及升级都是由相应的开发工程师负责的。由于开发工程师的工作直接关系到产品的质量和在线情况,所以开发工程师的责任是很重的,他可能经常为了下个版本的发布而加班,为了产品的故障不得不在休假的时候打开电脑工作,甚至在过年的时候都会接到领导的电话。所以你看到那些总抱怨加班太多,总是说自己是“IT民工”的,大部分都是开发工程师。在工程师当中,大部分人都是做产品开发的,毕竟公司都是要靠产品盈利,招聘的大部分人也要直接为产品服务。

做开发是很辛苦,但也有好处,因为需要对产品线负责,所以会是公司的核心,裁员对你威胁不大,如果你负责的产品恰好又是盈利产品的话,那么加薪、奖金、集体出游等福利都不会少。如果你足够幸运地加入了一家快速发展的创业公司,说不定一下子就发家了。还有很重要的一点是,作为产品的开发人员可以看到自己做的东西被那么多人使用,那是一种莫大的鼓励和肯定。

苦闷的开发工程师

尽管我很尊重开发工程师,但是我不得不承认,在国内大部分的公司,做开发工程师是没有前途的。首先,从微博到开心,有多少国内的产品不是山寨的?这也罢了,最恶心的是有一些产品经理连产品设计图都懒得自己画,直接去截取别人产品的图片,假如我是一个人人网的开发工程师,每天看到产品经理把 Facebook 新上线功能的截图拿过来让我做,你让我如何对产品有荣誉感和认同感?而如果一个开发工程师对自己做的东西没有荣誉感和认同感,那么他坚守自己的岗位要么是因为公司给的钱多,要么是因为他还没有找到下家。我个人认为,做开发最大的一个好处就是可以亲手实现一个“自己的作品”,就算平时很累,但最后完成它的时候也还是会无比满足,这点被剥夺了之后,和饭店打工的服务员有什么两样?不一样是为了糊口吗?
我不知道别人怎样,但我自参加工作以来就一直纠结于此——甚至开发的大部分产品都不好意思写上自己的名字;直到前不久有机会去做一个公司内部使用的平台,才终于有个作品让自己觉得满意。相信很多开发工程师参加工作之前都对互联网上很多诸如Gmail, Facebook 等优秀的产品耳熟能详,自己也常梦想做出那样的产品,但万万没有想到的是,工作之后要学习的第一课就是“不要对自己做的东西有感情”——有了感情你就不愿意做广告弹窗,不愿意看到它下线,不愿意为了短期利益伤害用户。与此同时,你还要继续听产品经理和老大们满怀激情地说“我们一定要让用户喜欢我们的产品”。一个连开发工程师本人都觉得无聊的产品如何让用户真正喜欢呢?拿搜索巨人来说吧,Google 把社交网站看作是某种形式的娱乐而不是有用的工具,所以它会在社交领域失败,再牛的技术也无法遮盖情感上的空白。不过话说回来,这好像对于国内大部分的公司都不是问题,因为它们做一款产品只是想从用户那里拿到钱,如果以后用户流失了就下线,然后再开发一个新的。他们要的不是用户的长期感情,而是一夜情,开发工程师就是一夜情的工具。

其次,国内几乎所有公司的技术流程和技术积累都做得很烂,大部分都只是片面地追求开发速度。我们在大学里受到的教育是“文档和注释很重要”,工作之后才发现文档和注释是很稀有的东西,只有特别负责任的工程师才会挤时间去写。有一个很有意思的现象是,国内很多产品发布之后会特别自豪地说“XX 是我们开发团队在时间紧迫的情况下,封闭开发了X 天就完成的!只有最牛的工程师才能创造这样的奇迹!!多少个凌晨,XX写字楼上只有我们办公室的灯还亮着……”,然后你会觉得“好感动啊”,但冷静下来想一想,这种拼命赶工做出来的东西质量会过硬吗?抛开产品质量不谈,没有时间写文档、没有时间写注释、没有时间做 code review, 没有时间做阶段总结……没有了这些,作为一个开发工程师你通过这个项目可以提升多少呢?所以好多开发工程师一开始是“代码民工”,过了几年还是“代码民工”,而一个人年富力强的时间又有几年呢?怪不得那么多人说工程师和妓女一样,都是吃青春饭的。

发展方向

我个人认为,国内的开发工程师大概有三个发展方向:1.做管理。 2. 去做架构等与产品关系不那么紧密的研发。3. 提升其它方面的能力,做 “A+ Player”,然后自己创业。我对管理没有研究,也没有兴趣,这里就不说了。研发我会在下篇中细说,这里主要说一下第三条。

为什么要关注代码之外的事情

如果你只会埋头写代码,那么代码写得再好也可能不会是一个好的开发工程师。做开发不是做学术研究,你的任务不是去钻研技术,而是利用自己的技术把产品做出来。尽管技术能力是基础,但如果无法把能力很好地应用到开发当中,那么你在团队中就没什么价值。举个例子,如果你不能很好地理解产品需求,那么就会根据自己的理解去做技术方面的架构和编码,等到后来发现了再去修改就特别麻烦,这个时候技术能力强反而成了坏事,南辕北辙的故事我想大家都听说过。

很多开发工程师属于那种“很本分”的人,从来不会提出意见,不关心产品形态和细节,只是去做产品经理提出的需求。我觉得别人把工程师叫做“代码民工”也就算了,但是工程师对自己做的东西完全没有看法,那就是甘心沦落为民工了。这也有文化的原因,国内的公司都喜欢那些不爱抱怨的员工,因为他们听话而且符合中国传统的价值观,但我更喜欢那些爱抱怨并且抱怨得有道理的人,因为国内(不只是互联网上面)粗制滥造的东西实在太他妈的多了,不抱怨才不正常,有不满才会去思考如何做得更好。

曾经听到有人谈论如何管理技术人员的时候说:“管理技术人员很简单,找一个比他们都牛的人就行了。” 这个人很了解工程师的脾气。工程师去判断其他工程师的时候,往往只看他的技术能力,觉得谁的技术好谁就最牛,其它的都无所谓。没错,技术牛的工程师写的代码质量很高,但这只是一个方面而已,判断一个人在团队中是不是“很牛”要看他对团队对产品的整体贡献,而不是他的个人能力。他能很好地理解产品需求吗?能很好地理解设计师的意图吗?和团队其他成员沟通顺利吗?写出的代码方便测试吗?会对产品提出好的建议吗?……这些都是判断一个开发工程师的标准,整体素质越高在团队中的价值也就越大。

所以要想做一个好的开发工程师,就要在写好代码的同时努力提高其它方面的能力。我知道大部分的工程师都喜欢和机器而不是和人打交道,所以遇到和产品经理、设计师以及 QA 等部门协调沟通的时候就皱眉头。协调沟通确实是一件闹心的事情,但从另一方面来说,这是开发工程师的一个得天独厚的优势:你可以深入接触产品生产线上的所有环节。需求评审的时候,你可以了解产品设计;开发界面的时候,你可以了解到视觉和交互设计;测试的时候,你可以了解到产品测试的细节;上线的时候,你也可以多观察 Ops 同事的操作。如果你可以在协调沟通的时候学会换位思考,多从对方的角度看问题,多想一下“他为什么要这么做”,那么不知不觉就会对各个领域有一些了解,进而发现原来每个领域都大有学问,就不会因为周围那些学艺不精的人而轻视他们所在的领域。

学习设计

对于工程师来说,测试和上线都是技术性的工作,和开发有很多相通的地方,而产品设计、交互设计和视觉设计等设计领域则比较陌生。对于自己不了解的东西,我们的看法往往会趋于两个极端:要么是看得高深莫测,要么是看得一文不值。其实对于大部分的东西,只要不笨并且愿意下功夫学习,总是可以学会的。尽管达到大师的水平可能需要传说中的“天赋”,但做到中等水平并不是特别困难。关于设计领域我一直在断断续续地在学习,到现在可能连略窥门径也算不上,这里只是说一下我个人对设计的理解和心得,供大家参考。

产品设计

产品设计看上去比较简单,因为只要清楚自己想要做什么,那么自然可以慢慢勾勒出产品的形态和功能。要做好产品设计,就需要平时多下一些功夫,多研究一下互联网上那些已有的产品,另外还需要多看一些诸如社会学、历史等“闲书”,举个例子,假如你想开发一款针对台湾用户的产品,那么了解一下台湾的文化肯定是有必要的。总之,学习产品设计是慢功夫,没有什么速成的捷径,只有一点一滴地不断积累才能培养出敏锐的产品意识和深刻的洞察力。
工程师学习产品设计有一个优势,那就是设计出来的产品是自己亲手实现的,你可以在实现的过程中不断重新反思原来的设计,然后加以修改和完善。这就好像写文章一样,很多时候你写东西的时候并不清楚自己具体要写什么,但只要是下笔开始写,写着写着就会发现新的想法,写作的过程同时也是思考的过程。写作和写代码很像,它们不仅可以表达想法,还可以创造想法。

视觉设计

很多工程师听到视觉设计会立刻退避三舍,觉得自己“不会画画”、“不懂配色”是不可能学习视觉设计的。诚然,视觉设计是需要更多艺术方面的基本功,要完全掌握需要长期的训练,但我们还是可以从简单的学起,慢慢培养对设计的感觉。我个人在这方面所知非常有限,但是对视觉设计中的完美主义印象深刻。
编程的时候,如果你的某行代码多了一个空行可能不会有什么问题,但在视觉设计中差了 1 个像素或者 10% 的透明度就是不可容忍的,很多设计师要求的都是 “Pixel-Perfect”——像素级别的完美。如果你不苛刻地追求完美,几个这样的“小瑕疵”就可以把整个作品毁掉。在我没有接触过视觉设计的时候很难理解这一点,切页面的时候并不会特别仔细地去看设计图,而且为了降低技术难度会想当然地篡改设计师的意图,比如把一些微小的渐变用纯色代替,这是很无知的做法。所以当设计师要求你做一个 1px 的修改的时候,即使会花掉你几个小时的时间也要听他的——只有这样才可以把界面做到百分之一百的完美。当然,设计师自己做不到完美另当别论。

此外,作为一个页面设计师,从职位名称上来看他的最终作品应该是页面,而不只是视觉效果图。所以我觉得页面设计师应该精通 CSS,只有自己才可以精确实现自己的设计意图。对于那些没有受过设计训练的工程师来说,很难注意到页面上色彩、字体和渐变的细节,让他们精确实现一个设计师的意图几乎是不可能的。精通 CSS 对于页面设计师来说并不算一个过分的要求,很多国外的设计师甚至可以自己用 PHP 写出产品原型,相比之下,国内的页面设计师进化得实在太慢了。

交互设计

交互设计是有关行为的设计,它更关注如何让产品更好用。举个例子,网页中一般都有很多超链接,当你把鼠标移动到超链接上的时候,鼠标形状会变成手型,暗示它是可以点击的,而且访问过的超链接和普通超链接的颜色是不同的,这样就很好地引导了用户行为。
之前我一直把设计和“视觉设计”等同起来,但在深入了解了之后发现,对于互联网产品来说,交互设计要比视觉设计重要得多,而且交互设计相对于视觉设计也更加有迹可循,对“感觉”要求没那么高,工程师完全可以把重点放在交互设计上。如果交互设计做得好,视觉设计遵循一些标准,那么完全可以做出一款“不难看并且好用”的产品。没有人特别夸赞 Google 的产品“好看”,但它们都特别好用,Google 注重的是易用、快速,用户体验是很棒的。
互联网行业的大部分页面设计师(Web Designer)都是学习平面设计出身的,但我觉得网页和软件设计更像是“显示器里面的工业设计”。很多平面设计师设计出的页面很好看,好像海报一样,非常适合打印出来,但往往对交互方面重视不够。不太好看影响不会很大,但不好用就没有办法留住用户,而且有时候太注重外观的视觉效果反而会分散用户的注意力进而影响产品的使用,这种 “eye candy” 是糟糕的设计。现在专门培养交互设计师的机构不多,我很希望对互联网有兴趣的工业设计师们到这个行业中来。

关于设计我就说这么多,以后有机会再另外撰文专门探讨这些主题。值得一提的是,没有人可以真正把设计和开发全部精通,如果深入到细节,无论设计和开发都会占用你大量的时间和脑力。单从设计来说,需要掌握的就有颜色、字体排印(Typography)、排版(Layout)、交互设计等,其中每一种技能又涵盖无数细节,真的是要皓首穷经才可以在其中的某个领域成为大师。不过,即使你对这些知识只是有一个大致的了解,以后在看一款产品的时候也可以从功能、交互、排版、页面代码、整体性能以及URL语义化等各个方面进行全面而细致的分析,明白它哪里做得好,哪里做得不好,而不是在那里想当然地说“真酷” 或者“狗屎”。真正了解什么是好的什么是差的,自己做东西的时候才会心中有数。

一专多能的好处

很多人可能会说:“一个人要是可以把所有事情都搞定,那还要其他人干嘛?我更相信团队的力量。” 没错,一个人就算从设计到开发都精通,如果只有他一个人做东西,开发效率也不会高。但是若你真的花心思去了解那些“与代码无关的事情”,你就会在写代码的时候更多考虑到产品经理/设计师的想法,对产品经理/设计师疏忽的地方也可以及时提醒,让自己真正地融入整个团队。目标并不一定要实现,它是用来指明方向的。开发工程师提高自己的产品意识和设计能力绝对不会是白费心血,不然的话你就只是一个实现产品的工具。你只会回答别人提出的问题,而好的问题要比好的答案有价值得多。

当你各方面能力提高得差不多的时候,应该就可以出来创业了(注意,我说的是创业,不是去创业公司打工)。因为对各个领域都有一定的了解,平时也经常接触到各个领域的人,那么在创业的时候你就很清楚自己需要什么样的产品经理/设计师,知道具有什么样能力的产品经理/设计师才是最好的,这样就可以从一开始就保证团队的质量和气质。很多互联网的业界前辈都说过“要招聘最好的人”,但问题是你如何判断一个人是不是该领域最好的呢?如果一个人对程序和设计一窍不通,满脑子都是商业运作,你觉得他有可能找出最好的工程师和设计师吗?有一次和一个创业公司的CEO聊天,他和我讲他们“只招聘 Geek”,后来我才发现他其实根本不知道什么是 Geek,只是不知道从那里听到 Geek 这个词,他真正想要的应该是那种只知道写代码愿意没日没夜任劳任怨给他当牛做马的人。国内大部分的创业公司就是这样,老大们喊着技术密集型的口号,实际上做着劳动密集型的事情,金玉其外,败絮其中。你可以和他们不一样。

我自己并没有创业的经历,也没有创业的打算,所以对创业的理解可能很片面而且天真。但是我相信,找到最好的人永远都是关键,不然即便后来成功了,也不过是多了一家靠人数取胜的血汗工厂。假如你选择成为移动互联网的独立开发者,对一个产品各个环节的全局把握也是有必要的。如果一个团队的每个人都能独当一面并且可以很好地理解其他人的意图和专业技能,就算最后在商业上失败了,那也会是一个幸福的团队,比那些除了盈利之外找不到任何亮点的团队好太多。

对产品经理的偏见

在“开发”这个小节的最后,我想多说一点自己对产品经理这个角色的看法。在国内绝大多数公司,开发工程师的作用就是把产品经理的想法以代码的方式写出来,“代码民工”这个称呼倒是很恰当。我对互联网行业的产品经理们一直感到很奇怪:他们没有能力把自己的想法实现出来,但是却几乎总是认为自己比其他人更理解产品;当工程师对产品提出自己的意见的时候,他们往往会心中不屑但尽量保持礼貌挤出微笑说一句:“呵呵,工程师不是普通用户”。一个产品本来就是需要很多人齐心协力一起完成的,产品经理和工程师的地位也是平等的,但是由于产品经理在工作流的上游,所以情况往往演变成工程师在为产品经理工作。如果产品经理真的对产品负责也就罢了,可惜的是大公司的产品经理大部分是对KPI负责,小公司的产品经理大部分是对老板的个人好恶负责,结果就是工程师跟在产品经理屁股后面做一些莫名其妙的事情。我接触到的几乎所有开发工程师都对他们的产品经理头疼不已,据他们说,好的产品经理就像真正的爱情,是极为稀有和可遇不可求的。

按照现在大部分公司的分工方式,产品经理是产品的总负责人。根据我个人的理解,产品经理之于产品,应该相当于导演之于电影,建筑师之于建筑。一个导演如果对拍摄一窍不通,那么就很难控制镜头的表现力;一个建筑师如果对建筑材料和结构一无所知,就不可能把握建筑整体的感觉。那为什么那么多人会觉得产品经理可以不懂技术不懂视觉设计,只需要写好文档画个框图然后交给别人去做就可以做出好的产品呢?本来是一个需要对各个领域融会贯通最难做得好的角色,现在反而被很多人视为清闲的差事,不爱干活的人纷纷想要转去做产品经理,实在是可悲至极。

我一直坚信好的工程师是不需要产品经理的。如果一个产品非要有一个什么产品经理的话,Google 的很多产品都不会出现,DropBox 这种只招聘工程师的公司也早就完蛋了。很多伟大的产品都是几个工程师想到一个点子然后慢慢做出来的,比如 Paypal 和 Google. 但需要说明的是,我讨厌产品经理并不是说我推崇“技术导向”——无论怎样产品都应该是让用户使用的,而不是用来炫耀技术的,只不过工程师不需要产品经理也可以设计好一个产品并且实现它。产品设计不是产品经理的专利。

想知道懂得设计的工程师没有产品经理的时候可以做出什么东西吗?去看一下 Livid 做的 V2EX 就知道了。在国内,设计和代码都有品味的网站可不多,我觉得 Livid 同学真是开发工程师的典范。

研发

相对于开发来说,我个人更喜欢研发一点。研发和开发的一个不同之处就是研发有更多的“研究”成分在里面,也就是说研发的时候会有更多“光明正大”的学习时间,这对于那些对技术本身有追求的工程师来说是很有吸引力的。有一些人做工程师是为了可以创造出好的产品,然后挣大钱或者改变世界;也有一些人做工程师是因为对技术本身有兴趣,想要好好研究。可以凭借技术名利双收变身成功人士固然很有吸引力,但不关心世事钻研一些自己喜欢的东西也自有它的乐趣在。

如果说开发产品是“输出”,那么学习思考就是“输入”,只有输出没有输入整个人就会废掉,完全沦为一颗螺丝钉。在很多公司尤其是那种经常加班赶项目的公司,你每天都会处于很忙碌的状态,脑子里想的都是赶紧把指定的任务完成上线。因为时间紧,所以你在开发过程中遇到什么问题都是只求解决,没有心思和时间去搞明白为什么会出现那种问题,在这样的工作状态下完全没有办法积累工作经验,看上去好像工作了五年,其实是工作了一年,然后重复了四年。
做研发一般不会直接为产品贡献代码,更多做的是一些基础架构或者实验性的产品,所以它有几个很明显的好处。首先,很少开会。其次,没有产品经理。第三,一般都会把质量放在第一位,时间不会特别紧。这是三个非常巨大的优势,这意味着你绝大部分时间都可以安心学习、思考、设计、编程,幸福指数会飙升。如果你是做基础架构,那么代码质量就会有硬性要求,你不得不写得健壮、易用、松耦合并且易于调试,要花心思和时间细细打磨,对个人的能力提高、习惯养成和经验积累都非常有帮助;如果你是做实验性的产品,那么你就有大量的机会和时间去调研最新的技术,而且最棒的是你可以在产品当中使用它们——这对于开发线上产品的工程师来说是不太可能的,因为不成熟的新技术存在太多未知的风险。

此外,做研发对工程师的素质要求很高,需要很好的技术基础、学习能力和研究能力——我把它看作是一个优点。从个人角度来说,我宁愿一家公司招聘非常严格需要竭尽全力才可以进去,因为严格的招聘可以保证团队所有成员的质量,不用担心进去之后会“和臭棋篓子下棋”。既然选择去做研发,那么基本可以说明你是一个对技术有追求的人,也肯定希望周围是一群和你一样的人,而不是连基础知识都不够熟悉的家伙。只有这样一群“互相看得起”的人在一块研究、学习、思考、切磋才会其乐无穷,才能够产生更多创意,做出好玩的东西。

当然,做研发也有不好的地方。只有大公司才有研发部门,这些公司一般都已经上市或者员工已经很多,你不太可能有机会一夜暴富。当你埋头做了几年研发之后,某一天去参加同学会,发现大学时候那个数据结构不及格总是求你让他拷贝编程作业的张三衣着光鲜四处敬酒。他所在的公司刚刚上市,因为进去得早,现在他变成了百万富翁而且荣升高层。于是你忽然开始怀疑自己当初的选择,连学习和编程的乐趣都变得很不真实。所以,如果你渴望建功立业,那么就不要选择做研发,或者做几年研发之后就出来闯荡。成功需要的条件很多,而编程只是你的优势之一,只有这一个优势你需要太多的运气才可以得到你想要的。

不过,我们也可以换个角度看。“乱世放不下一张安静的书桌”,现在到处都无比浮躁,有个地方可以让你安安心心做一些自己喜欢的事情已经非常难得,多少人拼命挣钱就是为了可以和你一样做自己喜欢的事情。尽管那么多人在叫嚷“搞原子弹的不如卖茶叶蛋的”,但总有一些人愿意去追求人类最高财富——知识和艺术家般的技艺。

本来做研发成就感会少一点,作为一个 Twitter 的开发工程师看到那么多人在用 Twitter 肯定会特别开心,相比之下某个在 Google 做基础研究的工程师的成就感可能没那么强烈。不过在国内环境比较神奇,开发工程师非但成就感不多,反而会不少挨骂,还经常会有负罪感,相信做过邮件推广和广告弹窗的工程师都深有体会。这样一来,研发工程师的“清苦”反而变成了一个优点,可以远离很多“不得不做”的违背良心的事情。

相信很多工程师在入行之前是喜欢技术的,但是工作之后发现完全不是自己当初想象的那个样子,然后就变得失望麻木,不再对技术有热情。其实你可以把热情延续下去,只不过要去做研发,而不是做开发。大部分由于兴趣而不是生计学习编程的人,内心真正渴望的都是去做研发,只不过没有人告诉他们开发和研发的巨大差别。现在不少大公司都有自己的研发部门,有一些还成立了自己的研究院,想要一直做技术的同学不妨尝试一下。

如何选择

很多人在大学里之所以会选择计算机为自己的专业,并不是因为自己对计算机和编程有兴趣,而是因为计算机是“热门专业”,在毕业之后也浑浑噩噩地找了一份工作进入了这个行业,做着自己并不喜欢的事情;还有一些人则是毕业之后找不到工作,然后看到一些培训机构的广告就去报名学习编程,希望广告上描绘的“月薪过万”不只是一场梦。于是就有了越来越多的“代码民工”,在形形色色的大小公司做着又脏又累的工作,只为了“混口饭吃”。

我并不想批评这些人,毕竟在这个大环境下有着太多无奈,逼得我们无从选择。对于这样一些只想找一份好工作的人,是被骗到这个行业中来的。仔细回忆一下,这些年来我们看到的业界新闻,了解到的互联网公司文化,大部分都是有关诸如 Google, Facebook 等国外公司的;我们平时学习和使用的技术,几乎都是国外发明的。这让我们深信互联网就是那样美好,那些激动人心的东西触手可及,但请你关上电脑出门好好看一下周围:这是在中国。互联网没有国界,但互联网公司有。Google 和 Facebook 这样的公司看上去离我们很近,我们每天也使用它们的产品,但国内的互联网公司可能要几百年之后才会有那样的气质和文化。所以如果你不幸误入了这个行业,还是及早打算改行或者转型做管理比较好,这样就不需要再学习自己并不喜欢的“枯燥”技术了。

对于那些“真的”对技术有兴趣的人,要么去做一个同时具备软件设计能力的开发人员,也就是富有创造力的Hacker;要么去做一个自得其乐的研发工程师。虽然环境恶劣,但是任何东西都挡不住真正的热爱。在这个几乎人人都把金钱作为衡量标准的社会里,你真是得到了上天的眷顾,不仅能够以自己喜欢的事情谋生,而且收入还过得去。

Hacker 是适合创业的,因为他拥有创造一个产品的全部能力。电影《社交网络》让很多以写代码为生的人产生了幻觉,Facebook 创始人传奇般的经历好像在向全世界宣布:世界是程序员的。很多人只是激动地看到扎克伯格的技术能力,但是却忽视了他的软件设计能力和对产品细节的重视程度,好像只要埋头编程就可以做出 Facebook。除了优秀的技术能力之外,扎克伯格的思考能力和创造力同样出类拔萃,可以感受得到他眼里的世界是不一样的。我们的工程师又有多少人对生活中的事物有独特而深刻的理解呢?独立思考也应该是 Hacker 的必备技能。

很多工程师都觉得自己会编程,只是缺少一个“好的 idea”;很多非技术人员则觉得自己有一个“好的 idea”,但是缺少编程能力来实现。要做一个产品,好的 idea 和实现它的能力缺一不可。然而,我们可以看到最后成功的往往是那些非技术人员,因为他们可以清楚地看到编程是一件可以学习的事情;而工程师们则往往天真地认为好的 idea 靠的是“灵机一动”,不会有意识地培养自己的观察能力和想象力。很多好的 idea 都是来自于平日对生活的敏锐观察和思考,然后这些点在某个时候忽然连成了一条线,把它简单地归结为“天才”是懒惰的做法。

“成为一个 Hacker”和“做研发”,很难说二者哪一个更困难。Hacker 在技术上可以不是一流,但他运用技术创造产品的综合能力肯定是一流的;而研发更注重技术上的造诣和理解程度,关注的是深度而不是广度。如果想要做研发,那么就要好好把基础知识研究透彻,比如数据结构、算法和网络协议等,不然很容易就会遇到瓶颈。我遇到过的每一位研发工程师都是技术上的大牛,在很多技术问题上都有非常深刻的见解;他们会从本质上分析问题,而不只是纠结于语言细节。

如果你想要通过自己的作品改变世界,那么就好好提高一下编程之外的能力,做一个好的 Hacker;如果只想埋头技术,就应该选择去做研发。不过,无论是想要做一个 Hacker 还是一个研发工程师,都需要长年累月地不断学习和思考。听上去好像非常辛苦,不过每一个热爱技术的人应该都会把学习和思考当作一种乐趣,而不是一种苦役。如果你无法享受学习和思考的乐趣,那么还是不要在技术这条路上走下去了,你会活得特别累,并且毫无幸福可言。

在这个充斥着“代码民工”并且缺乏“技术文化”的国度,我们只是关心怎么样可以活得更舒服,似乎忘记了编程本身所具有的迷人色彩。Joel Spolsky 说过,许许多多的人选择编程,首要的原因就是,他们宁愿将自己的时间花在一个公平有序的地方,一个严格的能者上庸者下的地方,一个只要你是对的就能赢得任何争论的地方。此外,我觉得选择编程还可以获得最大限度的自由和独立。因为找工作的时候只需要凭借自己的编程能力,所以不需要见人说人话见鬼说鬼话,不需要去结交权贵达人,不需要去为了所谓人脉去混圈子,也不需要看到邮件列表里有领导的邮件就去“顶”。平日里写写代码,其它时间喝酒吃肉,只交性情相投的朋友,武侠小说里的畅快适意也不过如此。这种独立和自由是极为宝贵的,你可知道有多少人在醉酒之后哭喊“安能摧眉折腰事权贵,使我不得开心颜”?

所以说,编程这件事情关乎公平,关乎自由,关乎美。而作为一个拥有编程能力的人,你可以亲手创造美。只有艺术家才可以创造美。希望有越来越多的人可以真正领会到编程的魅力所在,喜欢上这种艺术。正如 Raymond 所说,软件设计和实现应该是一门充满快乐的艺术,一种高水平的游戏。你需要用心。你需要去游戏。你需要乐于探索。

黑客事业之未来, 全依赖我们今日之创造。

最后推荐一些文章和书,这些文章和书大部分都与技术细节无关,它们讨论的是基于编程的令人心醉的文化,也适合非技术人员阅读。

  1. 如何成为一名黑客。所有学习编程的都应该多看几遍这篇文章,至少把 Hacker 和 Cracker 的区别弄清楚。
  2. 大教堂和市集。这是一篇关于 Linux 的经典文章。这里需要声明一下,我对那些 Windows 程序员没有偏见,只是我觉得作为一个以编程为职业的人,如果不参观一下 Linux/Unix 的深邃世界,未免太过狭隘。
  3. UNIX编程艺术。这本书虽然名字叫做“编程艺术”,但里面并不讲授如何编程,而是全面展示了迷人的 Unix 哲学和文化。看完之后你会发现,那些看上去不修边幅、整日对着电脑屏幕编写代码的邋遢程序员,对于美竟然会有那么高的追求。“美在计算机科学中的地位,要比在其他任何技术中的地位都重要,因为软件太复杂了。美是抵御复杂的终极武器。” 这本书的作者 Raymond 同样是《如何成为一名黑客》和 《大教堂和市集》的作者。
  4. 黑客与画家。这篇文章是 Paul Graham 写的,文中详细描述了黑客与画家的相似之处。这里所说的“黑客”和《如何成为一名黑客》中所说的“黑客”略有不同,但你可以看到他们很多共同点。本文也已经被收录到 《Hackers and Painters》一书,该书的中文版《黑客和画家——Paul Graham文集》由阮一峰翻译,应该很快就会面世,我十分期待。
    5.创造者的品味。作者同样是 Paul Graham,文章观点独到,见解深刻,每读一次都有新的收获。
  5. 软件随想录:程序员部落酋长Joel谈软件。这本书是 Joel Spolsky 的精华文章结集,作者写文章写得非常有趣,擅长讲故事,前几天我翻译的那篇《程序员阿士顿的故事》就是他的手笔。本书由阮一峰翻译,翻译质量非常高,有兴趣的可以先去试读几篇。
  6. About Face3交互设计精髓。本书是交互设计领域的经典著作,作者之一 Alan Cooper 原来也是知名程序员,被称为 “Visual Basic 之父”,所以这本书里面对程序员的批评还是很中肯的。另外,书中“设计体贴的软件”的核心思想非常棒,值得程序员好好阅读和思考。

来源:zhuoqun