文章

/文章
文章2019-08-12T14:09:08+08:00

写了35年代码的老程序员一个最大遗憾

大约不到20年前,我处在人生十字路口上。我的第二家公司当时已经花了5年时间为出版行业打造专业图表制作软件,不过在那互联网即将大热的年代,出版商们已经逐渐向互联网领域转移,我们的业务渐渐枯竭。那时候我已经是一个有 13 年编程工作经验,而且同时有 9 年公司运营经验的综合性人才了。 今天,我还是一个程序员。所以说现在谁是小角色呢?我怀疑我是不是有一天真的能退休。幸好我还是比较擅长做程序员的(我现在的工作是我以前的一个经理给我的,他有一个需求而且知道我能做这件事情),但是到目前为止,我所能做的也就只能是一个程序员。 我做程序员有大约35年了,其实完成工作的感觉还是很有意思的,而且这么多年我也确实做了不少出色的东西。但是我也感觉到我对当年没有去接受成为一个管理者的挑战产生了悔意。在某种程度上,程序员确实是一个单纯的选择。考虑到我经历了整个互联网(Dotcom)时代,也经经历了乔布斯回归苹果的事件,如果我还能有成为技术领袖的经验,那么我几乎可以无所不能。 所以说,是的,我对我没有把握住(成为管理者)的机会感到后悔,谁知道如果我当时把握住了现在会变成什么样。不过有失也有得,我因此得以享受书写代码的乐趣,以及那些为了解决为题而纠结烧脑的乐趣。 我不想再同时又干技术又干管理了。我的第一家公司(1985-1987年)的主要业务是打造一款电子表格程序,并有自动发布的功能。当时我一人主导了整个公司的多项事务,与媒体打交道的是我,面见投资人的是我,处理日常商务杂事的还是我,与此同时我还是公司的3个程序员之一并且兼任 UI 设计师。1987 年,当我们公司的产品成功发布后,我也终于积劳成疾住进了医院。这件事情让我明白,既要做软件公司管理人又要做程序员,这不是一个正常人能承受的。 点击查看原始大小图片 所以在1994年,当我再一次面临“管理者还是程序员”的选择的时候,我选择了程序员。因为我觉得程序员的工作比较单纯。现如今20年过去了,尽管在此期间我参与开发了很多不错的项目,不过我也终于认清了当年我的选择是多么的错误。尽管在当年,“CTO/CIO/副总裁级工程师”这样的技术管理路线还是很新的概念,但是在今天看来,这条道路才是正确之选。 1995年,我在湾区工作了大约一年。其中下半年我为苹果公司工作(伯乐在线补充:那会乔布斯还在 NeXT)。苹果那时候看上去就快要撑不住了,所以我就离开了苹果回到了德克萨斯。因为我不想眼看着我工作的公司垮掉。现在想来这真是个天大的错误。 后来,乔布斯回归,苹果重回正轨,不仅如此,.COM时代也浩荡沓来。作为一个经验丰富,训练有素的技术领袖,我对产品需求的理解是无与伦比的(我们当时发布了 9 款主要产品,都是直接针对主盘,并且不需要热补,总之在当时这是很难做到的),我只能说我可以想象我在那个时代原本是多么的炙手可热。一旦有人具备了这样的素质,在职业道路上不断攀升根本不是问题。 我妹妹在30年前也是以一个程序员,不过她很快在一年之内跳到了管理层并且在大约15年之后成为了一家大公司的副总裁。还有一家我工作过几年的旅游公司的母公司,他们的CEO大约在15年前也做过程序员。当然这些管理层的工作也并不能算得上轻松愉快,但是其工作报酬却(比程序员来说)要好太多了。我妹妹的薪酬大约是我的10倍。 这么多年来,我认识到作为一个程序员在能力上的局限性有多大。不管他们在专业方面多么出色,但是对于创新改变,或者把坏事变好这些方面的能力却很有限。我当年就是没有意识到做一个程序员所面对的这种局限性(甚至说架构师也是如此);在程序员这个层面上,你没有权利去改变现有的事物,因为你只是一个执行者。同样,你也不会参与到财务、IPO活动,以及其他一些重要事务,作为一个程序员,你就乐于去打造酷酷的东西就好了。 有大约5年的时间,我作为员工或者顾问为某些公司工作,这是我职业生涯最糟糕的阶段,我所做的事情都得参照一些糟糕的,愚蠢的,彻底白痴的技术管理的指示。在这篇文章里根本就列举不完这些愚蠢的事情。 比如作为一家银行的技术部门副总裁,他可以根本不懂技术,但还是有资格做技术方面的决定。同样在银行做CIO的人宁可相信供应商也不会相信他手下员工。当然,我们知道CIO拿了供应商的回扣,所以我们才必须买那些没用的东西,然后他还会不停地写文章证明那些没用的东西对我们是如何的好。尽管我们根本就用不上。有一次我离开公司以后CIO也被炒了鱿鱼,然后他离开了公司并立即在另外一家公司找到了一个类似的CIO的职位。 我做过的最糟糕的一个工作,其实一开始我是很看好的。一家后创业公司在其所在的领域有一个很好的契机。这家公司和其主要竞争对手(但是契机点不同)都想扩大市场,而且市场也确实在逐渐繁荣。我是作为公司的第二个程序员加盟的。先于我加入的程序员以及经理当时的任务是打造一个全新网上商店系统,因为旧系统太慢也太不灵活,完全无法适应更大的市场需求。这个公司当时没有技术领头人,CEO和其他两个创始人也没有任何的技术经验和知识。另一个程序员不停地说后端的代码如何如何好,然后经理也很信任他。我构建了一个前端模块,做了几个demo,并每天往代码库里更新。正当我觉得我写的前端代码已经可以和后端代码整合的时候,我突然发现,另一个程序员的代码库10个月以来就没有一次check in——一次都没有。我把这件事情告诉了经理,可经理却说:”他(另一个程序员)只有在一切都完美了以后才会check in代码。“并且除了我以外,没人觉得这种做法很愚蠢。此后,我花了两个月的时间,试图动员公司的创始人招募一些真正能做事情的人(其实我还是认识几个这样的人的),但是他们虽然承认之前在招人方面有失误,但是却害怕做出人事变动。最后我放弃了,离开了公司。 一年多以后,原先的两个人(另一个程序员和经理)什么都没做出来,双双被解雇。然后公司创始人又从咨询公司找了些人来,但还是什么都没有做出来。这个时候,所有的商机都被耽误了。竞争对手那边呢?他们已经成为了十亿美元级别的大公司,我经常会在电视商业广告上看到这家公司的名字。我每次看到这些广告的时候就想拿我的鞋子砸电视。我们其实就差一个在线商店和一个现实中的技术领袖。如果我当时的身份不是一个程序员而是一个技术负责人的话,那么现在大红大紫的没准就是我们了。很遗憾我只是个程序员。 类似的例子我可以一直列举下去,但是关键问题是:如果想要对技术人员的工作有话语权,你就必须同时有能力,有权利,还要有机会才行。一旦你做到了这些,并且你还找到了合理的成长模式,那么只有天空才是你的极限了。 1987年,我在电视节目《Computer Chronicles》中为我们的产品Trapeze做推广的时候,另一个参与节目的家伙叫 Mike Slade,他是Excel的产品经理。当时还很幼稚的我想,这家伙不过是不知道哪里跑来的一个搞市场的小角色而已(幼稚的时候人还真是很蠢呢)。后来呢,这家伙创立了一系列的公司,包括ESPN,他在苹果公司担任了各种领导角色,是乔布斯的至交好友,并且成立了自己的风投公司。  相关链接 > [...]

By |7月 21st, 2016|Categories: 技术资讯|0 Comments

转行做程序员之前你应该考虑的三件事是什么

2013-2014年间,全世界吹起一阵写代码的风潮,各大媒体疯狂报导,鼓吹年轻人不管所学为何,一定要学写程序。时不时就会看到「程序员是最有钱途的工作之一!」或者「连奥巴马都开始写代码,你能不开始吗?」这类的文章,不管金钱诱惑、名人带头,仿佛全世界都在疯狂的做程序。就算到了2015年底,不时仍有这类文章出现。相对之下,许多人认为自己目前工作很糟糕,包括老板高压统治、工作内容乏味、薪水仅能糊口等等,看到文章里头那些「高薪」、「出国工作」、「热门职缺」的字眼,是不是都想转行呢?今天就整理一些建议给大家。 第一件事,你对写代码真的那么热爱吗? 对于热情这件事,不得不再次提到二八法则,因为有80%的热门技术是由20%的人所构架出来。不管你未来所钻研的是哪种技术,总会在领域中有一些神人,他们可以1个人就超越10个的产值,对该技术有非常完整且深奥的了解,并且针对难懂的问题有非常优雅的解法。这些人决定了未来技术的走向,例如目前市面上的大型商业软件,许多都是由少数人将构架完成,后续才是由许多工程师进行维护、更新。 你想成为那些「大神」吗?虽然许多程序员做了一辈子也没办法,但仍然要保有那「想要成为大神」的热情,才能得到担任程序员的快乐。在生活中程序员不只会遇到系统错误,更常会遇到使用者给予的意见,包括常在Google Play或App Store上看到的评论:「这软件超烂」、「一分都嫌太高」等等,没有重点却严重打击士气,也是生活中的一部分。反之,尤其在大型项目上线,陆续收到使用者说回馈说:「使用上变得更方便了,谢谢你们!」这类温馨的评论让人非常有成就感。抑或是在钻研特别技术,而成功让项目有大幅成长的时候,例如用Go语言将部分Ruby on Rails的API服务重写,让整体速度提升20倍以上,这些数据都会让程序员非常有成就感,也是工作上很大的满足。 反之,当我们只想着要每天安安稳稳的写代码、维护项目,以上那些情况就绝对不会发生,我们整天只会自怨自艾,对现况感到不满却不改善,把所有的错都推给使用者、推给主管、推给别人。那不如不要转行了,不妨待在自己目前的位子上,好好过生活即可。一定要充满热情,想要成为「二八法则」中的领导者,跳进程序员这个圈子才有意义。 第二件事,不要被媒体的宣传蒙蔽了双眼 程序员薪水超高? 行行出状元,所有领域都有办法赚取高薪,但对程序员来说,情况比较符合「80/20法则」,就像许多人说的: 工程师饿不死,但也存不了什么钱。 不管是能力普通、只会听命行事的程序员,或是遇人不淑、老板吝啬的程序员,大概都无法取得高薪。若是半路出家的程序员,刚开始必然无法期待有超高的薪水,也很难找到商机立即创业,尤其转职的筹码较少,不像其他工种的学生许多有底子、有作品,找工作较为容易。 要谈高薪,还是得拿实力来谈,若是无法针对中型的软件项目设计出良好的构架、或是对自己擅长的技术还不完全了解,那对于薪水还是不要有太高的期待,而这些都是需要经验累积的。刚起步的程序员,对媒体报道分分钟年薪百万这类天花乱坠的形容词别想太多。 根据程序员客栈www.proginn.com这么多程序员的经历,刚起步的程序员只要有耐心,绝对能找到一份工作薪资可供生活,外加存点小钱。身为程序员,希望大家对普遍薪资较低的情况能有所抵制,对于过低的薪资要勇敢拒绝,接受的话只会放任无良企业继续用相同薪资雇用其他程序员,加上自己生活质量和士气也会跟薪资一样低落。 转行成为程序员后是否美好? 真正转行成为程序员了以后,问题才是接踵而来,很多事情等着探索。例如学历就是一大难关,程序员这个行业是看重学历的,当然这边讲的不是说一定要名校毕业,而是「本科系」这件事情是相对重要。我相信很多人都吃过这个亏,转行前一度以为可以靠一股热情打天下,殊不知在面试许多公司时,老板听到并非本科系都会眉头一皱。有一位好心的老板在通知面试未录取的时候,也同时说: “工资是和学历挂钩的,这是全世界通用的法则,未来你想成为资深开发者,这更是每位老板都会看的。如果没办法再修一个学位,至少要能提出证明你对这些机器、算法等硬底子的学问都有点基本认识。” 虽然感到震撼,但这确实点醒了我,程序员并不是单单会一项技能而已,而是要对整个领域略知一二。 另一个难关就是要保持热忱,程序开发技术推陈出新的速度超越其他领域许多,在工作压力下,许多人会选择不去学习,导致进步的速度跟不上整个世界翻新的速度。可能有在接触的人有听过近几年Web前端技术的战国时代,从Java延伸出来的框架多如繁星,从目前最热门的React Native,到前一两年窜起的Angular.js、Ember.js,外加之前打得火热的Node.js和io.js战争,每一年都有爆炸性的改变。 假如我今天是专精Web前端的工程师,在这些技术出现时,势必要了解他们要解决的问题、优点、缺点等等,并决定有没有需要使用这些技术来改变现有的构架。例如公司现有构架是直接用纯Java实作变数即时更新,如果改用Angular.js,可以大幅减少代码的数量,直接交给该函式库来处理。今天假如我们没有特别探究这些技术,未来在寻找其他工作时,技术主管也会期望你稍微了解这些技术。简单来说,你不前进,别人也会推着你前进。 这只是其中一个例子,程序开发领域在小地方都有无限多的变化,必须不断学习、接受改变。转职前,很多事情我们想的很美好,但在转职后,才知道这个领域有他自己的法则,在这边无法一一列举,但不管怎样,如果有决心、有热情,这些难关对你来说只会是长远路上的一块小石头。 第三件事,程序员都在做什么? 首先,程序员的领域有许多种,我以前被电影骗了,以为程序员就是电影里头的黑客,只要几秒就可以把非常大的系统架构给完成,凡提到入侵、破解、渗透等字眼,黑客都可以轻松处理。但说实在,「黑客」只不过是程序领域其中的一个范畴,举凡手机软件、网站、数据库维护、服务器、大数据等等,每一个领域都是一门专业,不光只是我们平常看到「Google工程师」、「Apple工程师」那样简单的分类法。 所以,当各大媒体都在鼓吹转职成程序员的时候,大部分谈的都是软件工程师(software engineer),最主要还是因为软件是我们日常生活最常接触到的,包括桌机软件、手机软件、网站,都是这几年如火如荼在发展的项目。 以下说到的程序员,指的都是软件工程师。所以工程师到底都在做什么?就工作来说,不超脱以下五件事情: 1,跟其他工程师讨论 2,编写代码 3,解决bug 4,和用户沟通 5,和产品撕逼以及被老板骂 对于水平比较初级的程序员,改BUG这个步骤会占掉绝大部分的时间,而且过程是非常无聊且漫长的。找一位工程师问他处理过最愚蠢的错误,一定回答是「为了找一个错字耗了一整天」,听起来有没有很浪费时间?没错,就是这么浪费时间!甚至,各种错误都是「屋漏偏逢连夜雨」,每当你最需要专心做其他事的时候,错误就出现了,然后手边原本规划要做的事情就这样搁置了,进度来不及,最后就被老板骂。这绝对是刚学程序开发的常态。当然,在这些错误当中,我们去学着如何写出更好的程序,避开那些给自己埋下的地雷,减少错误发生的机率。随着时间推进,我们就很少再犯这样愚蠢的错误。 [...]

By |7月 21st, 2016|Categories: 技术资讯|0 Comments

超齐全的资源收集

在菜鸟网上看到的资源集合,挺有用的,在这里分享一下。 技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 OSChina:开源技术社区,开源方面做的不错哦 cnblogs,51cto,csdn:常见的技术社区,各有专长 stackoverflow:IT技术问答网站 GitHub:全球最大的源代码管理平台,很多知名开源项目都在上面,如Linux内核, OpenStack等免费的it电子书:http://it-ebooks.info/ 不错的书籍 人月神话 代码大全2 计算机程序设计艺术 程序员的自我修养 程序员修炼之道 高效能程序员的修炼(成为一名杰出的程序员其实跟写代码没有太大关系) 深入理解计算机系统 软件随想录 算法导论(麻省理工学院出版社) 离线数学及其应用 设计模式 编程之美 黑客与画家 编程珠玑 C++ Prime Effective C++ TCP/IP详解 Unix 编程艺术 [...]

By |7月 19th, 2016|Categories: 教程指南|0 Comments

WeX5的小应用:二维码名片

前言 二维码现在是无处不在,无孔不入了。大到一辆汽车,小到一包纸巾,身上都印有二维码,明码标价。败家娘们可能会说:没想过要买的,真心的!就是看着漂亮嘛,想拍个照片,谁知道一拍就弹出个支付界面,想按退出但是手抖了。。。(这手抖的,不知道放在菜刀下会不会稳定一点?)而名片,也早就使用了二维码技术,扫一扫一键存到手机通讯录里面,是手机通讯录哦。今天小茄就试着用WeX5做一个电子的二维码名片,除了扫码外,还可以在微信里面一键识别并存到手机通讯录里面哦。 先上效果图   生成的二维码扫码即可创建通讯录,保存下来通过微信发给朋友,通过长按二维码识别也可以完成名片的分享。拿起手机测试一下吧: 这个应用的核心就是两个:将个人信息转换成二维码;二维码携带的名片信息可被手机识别。为了实现这个需求,我们需要用到一个名片格式:vcard,关于vcard的介绍可以参考这篇文章:http://lzw.me/a/php-qrcode-vcard.html。 vcard格式生成 我们的需求比较简单,需要将名片信息拼接成如下vcard格式: BEGIN:VCARD VERSION:3.0 FN:任侠 TEL;CELL;VOICE:15201280000 TEL;WORK;VOICE:010-62100000 TEL;WORK;FAX:010-62100001 EMAIL;PREF;INTERNET:lzw#lzw.me URL:http://lzw.me orG:志文工作室 ROLE:产品部 TITLE:CTO ADR;WORK;POSTAL:北京市朝阳区北四环中路35号;100101 REV:2012-12-27T08:30:02Z END:VCARD   这就是一般的字符串拼接了,这里有个问题,就是中文的展示问题,如果直接将中文拿去转化成二维码的话就会出现乱码,所以我们需要将其转换成utf-8的通用编码格式: 1 function toUtf8(str) { 2 var i, len, c, out = [...]

By |7月 1st, 2016|Categories: 教程指南|0 Comments

【WeX5的正确打开方式】(7)数据组件详解

【WeX5的正确打开方式】系列目录: (1)入门篇之进击的Hello World (2)入门篇之进击的Hello World(续) (3)WeX5绑定机制 (4)WeX5绑定机制(续) (5)WeX5绑定机制(续2) (6)数据组件初探 (7)数据组件详解 本文是【WeX5的正确打开方式】系列的第7篇文章,详细介绍WeX5中数据组件的增删改查以及数据定位方法。 前言     上一篇 数据组件初探 我们简单介绍了数据组件的引入和底层结构以及特性,并实现了简单的数据展示和数据改动。上一篇中简单提到了,数据组件就是后台数据库表在前端的一个映射,前后端开发人员只要预定好数据组件的内容,就可以简单实现前后端开发的分离。既然数据组件是一个数据库表的映射,那它的基本结构就是一张 2 维表格,举个栗子,定义一个 html5开发工具 的数据组件,xid 为 devtool : +-------+--------------------+----------------------------+---------+ | index | name | url | country | +-------+--------------------+----------------------------+---------+ [...]

By |6月 22nd, 2016|Categories: 教程指南|0 Comments

【WeX5的正确打开方式】(6)数据组件初探

【WeX5的正确打开方式】系列目录: (1)入门篇之进击的Hello World (2)入门篇之进击的Hello World(续) (3)WeX5绑定机制 (4)WeX5绑定机制(续) (5)WeX5绑定机制(续2) (6)数据组件初探     本文是【WeX5的正确打开方式】系列的第6篇文章,简单介绍一下WeX5中数据组件的特性和结构形式。 数据组件的由来     上一篇 WeX5绑定机制(续2)我们实现了一个简单的记账本应用,当时所有数据都用 JSON 对象写在 js 代码里面,然后通过绑定机制将数据和UI界面绑定起来。我们是这样写的: 1 var testData = [ { 2 fType : 'out', 3 fClass : '购物', [...]

By |6月 21st, 2016|Categories: 教程指南|0 Comments