12年前有人告诉我,你至少需要10,000小时才能说自己在某方面是专业的。对此我并不理解。假设我每月至少工作160小时,那么我每年工作1,920小时,除去五周的假期,那就是1,720小时。由于在这些时间里,我不可能100%都用来写代码,所以扣掉30%的话,最终差不多是每年1,000小时。

但是现在,12年过去了,在历经12,000小时的编程后,我理解了。我刚读到的亚里士多德的一句话,完美地描述了这个过程。

重复不停地去做一件工作,这个工作就会变成我们本身。到那时,杰出就不是一个动作,而是一种习惯了。(亚里士多德)

在这12年里,我有足够的时间去涉猎至少15种编程语言。有一些我很喜欢,而有的则是我讨厌的,还有一些是我必须学习的。

前言

在大学时我稍微涉及了一点 Java 和 Prolog,然后就去学习工作公司专有的脚本语言。在那里,我无意中地学习了ActionScript、Adobe Assembla、HAXE、Python、Q t和 C++。在家里,我用 Assembla 和 C 做了一些硬件项目。而现在作为自由职业者,我专注于 Objective-C、Swift、Scala、SQL、Ruby 和 Android Java。

有很多很多用于不同目的的工具。知道哪些工具适用于什么样的项目是很有必要的。如果我不知道的话,会浪费我数个小时甚至最高数天的时间来制作原型。经验让我更快、更高效。

现状

从技术上看,我越来越发现项目或多或少都是容易的。我的经验告诉我如何开始,如何构建和如何完成产品。所以我现在真正明白了10,000小时的意义所在。我需要面向市场的产品,但我没有经验。我不像现在这样使用过15种不同的工具,也不像现在这样知道哪些最适合个别的情况和目标。

回想起我的第一个程序,非常可怜,但这是我们迈开的第一步。从第一个小程序开始,然后是第一个博客,第一次营销活动,第一首歌。我们往哪个方向迈出第一步,往往是开始最重要的一个步骤,然后需要持之以恒的毅力。我知道我的一些博客很幼稚,但这些都是我通往10,000小时的旅程中所必须经历的。我也很肯定,很多我的营销活动都会失败,但我会从中得到学习和提高。

我的经验教训

现在,我偶然进入了一个新的我毫无经验的领域,而我很重视我所获得编程经验。然后我开始明白经验的真正意义。

我们年纪越大,我们就越怕学习,因为我们认为我们应该已经知道这一切了。我们懂得越多,学得更快,但我们不应该停止学习。我们学得更快,不需要花费10,000小时就可以取得成功。而这是成为专家的必经之路。

因此,我从10,000小时的编程中所学到的是,经验是我们学习的杠杆。保持学习,体验和实现。永远心怀感激。

我们可能爬了很多山,但我们大多数人都不会在我们的有生之年登上珠穆朗玛峰。只要值得,就去做。

有个人曾经问拿破仑是如何给士兵指派任务的。拿破仑回答说这很简单:士兵要么聪明要么愚蠢,要么懒惰要么精力充沛。

  • 聪明且精力充沛的我让他当战地指挥官。他知道该做什么而且能召集队伍去做。
  • 聪明且懒惰的我让他当将军。他也知道该做什么,但他不会浪费精力去做不必要做的事情。
  • 愚蠢且懒惰的我让他当步兵。

但那些愚蠢且精力充沛的呢?“他们”,拿破仑回答说,“我全给毙了。”

每当有人因为“很能干”而受到赞扬时我就会想起拿破仑的这个笑话。这样的人我们是该让他当指挥官呢?还是毙掉?

Joel Spolsky 说,理想的程序员应该是聪明且能干的。但怎么看待那些愚蠢且能干的人呢?

1992年当 罗斯·佩罗Ross Perot 竞选总统时,他的支持者惊呼“他很能干!”于是我问“他会做出什么你们想要看到的事情?” 我不记得得到过答案。他将要做什么看起来并不重要。(我并不是说 Perot 的竞选纲领很愚蠢。我不想讨论这个。我只是想说,即使很愚蠢,有些人也不知道,不关心。)

有一次,我听到有个人被赞扬为一个好老师。并不是知识渊博,只是个好老师。我不赞成一个无知的人可以被称为好老师,难道是说他在教授他的无知时很有效率吗?这不是一件很糟糕的事情吗?不,重要的是他是个好老师。

计算机程序有代码行组成,代码有字符组成。所以程序员应该擅长打字符。当然,更重要的是,他们要打出正确的,可维护的,能完成有价值的任务的程序码。

为什么有人会在不知道一个总统候选人的政治立场的情况下支持他?为什么会有人愿意给他们的孩子找个无知但有效率的老师?为什么有人愿意找一个精通编写烂程序的程序员?

我想没有人愿意看到这种事情,尽管有些人很短视。人们喜欢的有魅力的总统,好老师,高效的程序员。但人们很容易把这种事情简单化,只关注某些基本的品质,忽略了事情的整体情况。

领导要能干出点事情。老师要能教授。程序员要能写代码。这都是些基本必要的技能,但还不够。

AT&T选择Canonical公司成为合作伙伴,以推动该公司在网络和云计算等方面的创新。Canonical公司将提供Ubuntu操作系统和工程来支持AT&T公司的云计算、网络和企业应用程序。AT&T中意Ubuntu的原因莫过于后者的创新性,以及其在云平台和工作负载中卓越的性能。

AT&T战略规划部云计算技术副总裁助理Toby Ford说:“利用最新的技术和并根据开放的原则,AT&T未来的网络将会提供客户需要的东西。我们重塑网络,使之变得简单并且模块化,类似于在云数据中心应用程序的演进历程。开源和OpenStack代表着一个独特的机会来满足这些需求,Canonical的云计算和开源技术让他们成为AT&T的绝佳选择。”

Canonical公司云计算联盟和业务发展副总裁John Zannos表示:“这对Canonical来说是很重要的,AT&T可伸缩的开放的未来网络能够将Canonical innovation的优势发挥到最大。AT&T选择我们来支持其云计算、企业应用和网络,为我们与AT&T合作创新下一代以软件为中心的网络和云计算解决方案提供了机会。Ubuntu是云计算操作系统,这种合作关系让我们把Ubuntu工程经验带到AT&T云计算和开源中去。”

关于Canonical

Canonical是Ubuntu的主导者,主要致力于开发云计算操作系统、基于ARM的超大型计算、最安全的管理程序、最新的LXC和Docker容器技术。Ubuntu也是OpenStack中最受欢迎的操作系统,超过80%的OpenStack部署都是部署在Ubuntu上。

关于AT&T

AT&T是全球领先的提供娱乐、移动、高速互联网和语音服务,是世界上最大的付费电视提供商,付费电视业务涵盖了美国和拉美地区11个国家。在美国我们提供信号最强最可靠的4G LTE服务,AT&T是美国最大的无线服务提供商。其提供的灵活且高度安全的云计算解决方案,为遍布全球的用户提供服务。

让IE浏览器成为历史,这是微软给的最好礼物

自从微软宣布将在多数操作系统上停止对 IE 7、8、9和10提供技术支持,IE 也将成为历史。这是逐步淘汰掉这个从出世起就饱受争议的浏览器的最大进步。 

自去年三月起,微软就逐步地开始淡化 IE 这个品牌,开发出全新的浏览器 Edge ,但并没有立即杀死 IE 。Edge 只能在 win10 上跑,所以微软还会在老版本的 Windows 系统上对 IE 提供更新支持。总的来说,这是一个新的起点。从历史上讲,微软通常会同时支持多个版本的 IE 。从今天起,微软仅支持操作系统能够运行的最新版本的 IE 。对于老版本来说,不会再有新的安全补丁推送,因此大量的旧版本用户暴露在黑客及不安全因素之中。 

让用户在旧版本的浏览器中运行应用程序,一直是一个令所有开发者和机构头痛的问题。但也可能是一件好事,开发者和设计师们一直在寻找解决这一问题的最佳途径。而且,新版本的浏览器也可能有自己的脾气,一个网页在不同的浏览器上面看到的效果很可能并不相同。不过,这些细微的差异和 IE 在 90 年代末至世纪初对于万维网标准的践踏相比,不值一提。 

在 IE 浏览器上,微软坚持使用自己的网页标准,而对 W3c (万维网联盟)的标准不屑一顾,这使得微软长期决定着网页的设计标准。这导致很多有才华的网页开发者并没有被要求解决图像在不同浏览器上显出细微差异的问题。大量旧版本的浏览器仍在运行,更加剧了这种混乱局面。万幸的是,这段黑暗的岁月终于快要结束了。 

灰暗的旧时光

由于 IE 没有遵循制定网页标准的万维网联盟的指导方案,在 IE 和其他浏览器上看到的网页效果可能会完全不同,包括 Netscape,Opera  或 Firefox 等。绝望的设计师们很努力地想让网页尽可能的呈现统一的效果,但面对复杂的布局时,这种努力往往是无效的。而 IE 6因为存在的安全漏洞饱受批评,微软往往并没有第一时间修复漏洞。 

但既然 IE 如此糟糕,为什么能占有如此多的市场份额呢?在 1997 年,微软将 IE 预装到Windos中,这受到了无数人的反对与指责,并长期受到了政府的反垄断调查。由于大多数用户并不了解其他的浏览器,而 Windows 又占据了绝大多数的市场份额,微软通过捆绑销售轻而易举的赢得了这场战斗。 

但故事到此还没有结束。微软仍然把 IE 和 Windows 捆绑销售,但横空而出的 Google Chrome 后来居上,成为了最多人使用的浏览器。其中有部分原因是设计师和开发者们长久以来教育市场的结果。但在 1990 年代,无数的网站在网页上自豪地挂着“使用 IE 浏览器可获得最佳体验” 的横幅。 

“很少人记得这件事,特别是网页前端开发者,但确实有一段时间,IE 是世界上最好的浏览器。”长期批评 IE 的 JavaScricp 专家 Douglas Crockford 在 2010 年接受采访时说。IE 6 曾经远远领先于其他浏览器,但现在已经被竞争对手们超过。 

这是一种夸张的修辞。Netscape 6 和 Opera 5 都比 IE 6 更早推出市场且更为优秀。但实际情况却是 IE 6 花了几年时间弯道超车,夺得头把交椅。在 1997 年网景公司推出 Netscape Navigator 4 之后,竟然沉寂了 3 年,直到 2000 年才推出了全新版本 Netscape Navitor 5 。(网景公司并没有在 Navigator 4 的基础上迭代新版本,而是花了很大力气把 Navigator 5 重写了一遍。)同时,尽管 IE 并没有完全的遵循标准,但在 1990 年代末期,快速的增加了很多新的功能。在当时,开发者们如果想在浏览器上使用前沿的技术及交互性的功能,IE 几乎是唯一的选择。 

网景公司倒闭之后,部分员工成立了 Mozilla (火狐)社区,在 2004 推出了第一个版本的火狐浏览器,这让人们从死气沉沉的浏览器中看到了新希望。 

沉重的包袱 

2006 年,IE 7 终于推出市场,虽然比起之前的版本是一个巨大的进步,但对于W3C 标准仍然支持的不彻底,因此开发者们只能针对 IE 不停调试,使得网页正确显示。直到 2009 年 IE 8 的诞生,微软才终于第一个通过 Acid2 标准测试的浏览器。Acid2 被广泛使用于测试浏览器对 W3c 标准的支持。但对于其他的标准,诸如 WebGL 技术中的 3D 图形接口,则支持的更晚。那时候浏览器市场还处于波澜不惊的阶段,而 IE 的坏名声已经形成。 

但微软最大的问题在于 IE 6 的长期存在。为了兼容还保有大量用户的 IE6 ,许多机构不得不花费大量经费在照顾这些拒绝升级的用户。许多 Windows 用户并不清楚如何更新版本号,还有一部分盗版用户无法联机升级,他们都一直停留在旧的版本上。因此,微软不得不一直对IE 6提供支持直到 2014年4月8号,距IE6的推出已经过了 10 年的时间。 

为了避免重蹈覆辙,微软宣布不会对 Windows Vista 和 Windows Server 2008 上 IE9 以前版本提供技术支持,而在 win 7、8 及相应的服务器版本上,最低支持到 IE9 。此举很可能会把大量未升级的用户暴露在各种潜在的安全隐患之中,但从长远角度看,这会迫使用户尽快选择更好的浏览器。 

随着时间的推移,旧版本的浏览器会逐渐推出历史舞台,微软希望能够在浏览器战争中重新夺得往日的辉煌。Edge 就是一个全新的开始——新名字,推倒重来的代码,以及全新的 CEO。微软之前的恶行不会消失,但至少能解决现在馄饨的市场。

学术界是培养和塑造未来的开源开发者的最佳平台。研究中发现,我们偶尔会开源自己编写的软件。这样做有两个理由,一是为了推广自己编写的工具的使用,二是为了了解人们使用这些工具时会遇到哪些问题。在这样一个编写研究软件的背景下,我的任务就是为 Bradford 大学重新设计二年级的本科软件工程课程。

这是一个挑战,因为我所面对的 80 个学生是来自不同专业的,包括 IT、商务计算和软件工程,这些学生将要在一起上课。最有难度的是,需要和这些编程经验差距很大的学生一起编写代码。按照传统,该课程允许学生选择自己的小组,然后给他们布置构建一个加油站数据库系统的任务,最后提交报告作为评估的一部分。

而我决定重新设计课程,让学生了解现实中的软件团队是如何协作的过程。根据学生的专业和编程技能,我将他们分为五、六个人一组。这是为了确保每个小组的整体水平相当,避免小组之间的不等。

核心课程

课程的形式改为讲座和实践课两项结合在一起。然而实践课作为指导过程,主要是老师监督各个小组的实践进度以及他们如何处理客户和产品之间的关系。而传统的教学方式由项目管理、软件测试、工程需求分析以及类似主题的讲座组成,再辅以实践和导师会议。这些会议可以很好的考核学生的水平以及检测出他们是否可以跟得上我们在讲座部分中的软件工程方法。本年的教学主题包括以下内容:

  • 工程需求分析
  • 如何与客户及其他团队成员互动
  • 程序设计方法,如敏捷和极限编程方法
  • 如何通过学习不同的软件工程方法进行短期的水平提高
  • 小组会议及文档编写
  • 项目管理及项目进展图表(甘特图)
  • UML 图表及系统描述
  • 使用 Git 来进行代码的版本控制
  • 软件测试及 BUG 跟踪
  • 使用开源库
  • 开源代码许可及其选择
  • 软件交付

在这些讲座之后,会有一些来自世界各地的嘉宾为我们说说他们在软件交付过程中的经验。我们也设法请来大学里知识产权律师谈关于软件在英国的知识产权问题,以及如何处理软件的知识产权问题。

协作工具

为了让上述教学内容的顺利进行,我们将会引入一些工具,并训练学生在他们的项目中使用这些工具。如下:

  • Google Drive:团队与导师之间进行共享的工具,暂时存储用于描述项目的文档和图表、需求收集、会议纪要以及项目时间跟踪等信息。采取这样一个方式来监控并提供直接反馈到每个团队,是非常有效的。
  • Basecamp:同样是用于分享文档,在随后的课程中,我们可能会考虑用它取代 Google Drive。
  • BUG 报告工具,如 Mantis:只能让有限的用户免费提交 BUG。稍后我们提到的 Git 可以让小组内的所有人员用做 BUG 提交。
  • 远程视频会议工具:在人员不在校内,甚至去了其他城市的情况下使用。学生们可以定期通过 Skype 来交流并记录会议内容或则进行录音作为今后其他用处。
  • 同时,学生们的项目中还会用到大量的开源工具包。他们可以根据自己小组的项目需求来选择自己使用的工具包和编程语言。唯一的条件是,这些项目必须开源,最后成果可以安装到大学里的实验室,并且大多的研究人员都非常支持这个条件。
  • 最后,所有团队必须向客户交付他们的项目,包括完整的可以工作的软件版本、文档和他们自己选择的开放源码许可。大多数的团队选择了 GPLv3 许可证。

技巧和经验教训

在最后,这一年过的很愉快,并且所有学生的项目都做的非常棒。这里有一些我学到的经验教训,可能有助于提高明年的课程质量:

  1. 提供各种各样有趣的选择项目给学生选择。比如说,游戏开发或者移动应用开发以及完成各种目标的项目等。建立普通的数据库系统已经不能提起学生的兴趣了,而参与到有趣的项目中去,学生本身就是自学者,同时可以帮助解决小组成员和小组之间的常见问题。再通过一个消息列表,学生们发表他们在测试中遇到的任何问题,以寻求其他人的帮助建议。然而,这种方法有一个缺点。外部考官建议我们使用统一种类型的项目和统一的编程语言以帮助缩小对学生的评估标准。

  2. 定期给学生在每一个阶段的表现进行反馈。比方说,可以在和各个小组开指导会议的时候,或者每个阶段进行反馈,以帮助他们在接下来的工作中自我改进。

  3. 学生更加愿意与校外的客户一起协作。他们期待着与外部公司代表或校外人员协作,不过是为了获得新体验而已。与导师进行交流时,他们都能够表现得很专业,这样使得老师非常放心。

  4. 很多团队版将开发单元测试的部分放到项目结束之后,从极限编程方法的角度来说,这是一个严重的禁忌。也许测试应包括在不同阶段的评估中,来提醒他们需要并行开展软件开发和单元测试。

  5. 在这个班的 80 个人里边,仅有 4 个女生,每个女生都分在不同的小组里边。我观察到,男生们总是充分准备好来承担起领队角色,并将最有趣的代码部分留给他们自己来编写,女生则多大遵循安排或者是编写文档。出于某种原因,女生选择不出头,即使在女性辅导员鼓励下,她们也不愿编写代码。这仍然是一个需要解决的主要问题。

  6. 允许不同风格项目文档,比方说,UML 图表、状态图或其他形式的。让学生学习这些并与其他课程融汇贯通来提高他们的学习经验。

  7. 学生里边,有些是很好的开发人员,有些做商务计算的则没有多少编程经验。我们要鼓励团队共同努力,避免开发人员做得比那些只做会议记录或文档的其他成员更好的错误认知。我们常在辅导课程中鼓励角色转换,让每个人都有机会学习如何编程。

  8. 小组与导师每周见面沟通是非常重要的,可以有效监督各个小组进展情况,还可以了解是谁做了大部分工作。通常,没来参加会议的小组成员基本就是没有参与到他们的团队工作中去的,并且通过其他成员所提交的工作报告也可以确定哪些人不活跃。

  9. 我们鼓励学生们把许可证附加到项目中去,使用外部库以及和客户协作的时候要表明确切知识产权问题。 这样可让打破陈规,开拓思维,并了解真实的软件交付问题。

  10. 给学生们自己选择所用技术的空间。

  11. 助教是关键。同时管理 80 个学生显然很有难度,特别是需要对他们进行评估的那几周。明年我一定会找个助教来帮我一起管理各个小组。

  12. 实验室的技术支持是非常重要的。大学里的技术支持人员对于本课程是非常赞同的。他们正在考虑明年将虚拟机分配给每个团队,这样没个团队可以根据需要自行在虚拟机中安装任何软件。

  13. 团队合作,相互帮助。大多数团队自然而然的支持其他团队成员,同时指导员在中间也帮助了不少。

  14. 来自其他同事的帮助会锦上添花。作为一名新的大学导师,我需要从经验中学习,如果我想了解如何管理某些学生和团队,或者对如何让学生适应课程感到困惑时,我会通过多个方面来寻求建议。来自资深同事的支持对我来说是一种极大的鼓励。

最后,对于作为导师的我以及所有的学生来说,这都是个有趣的课程。在学习目标和传统评分方案上还有有一些问题需解决,以减少教师的工作量。明年,我计划会保留这种教学模式,并希望能够提出更好的评分方案以及引入更多的软件来帮助监督项目和控制代码版本。


via: http://opensource.com/education/15/9/teaching-open-source-development-undergraduates

作者:Mariam Kiran 译者:GHLandy 校对:Caroline

本文由 LCTT 原创编译,Linux中国 荣誉推出