要想交付最出色的成果,每位开发人员都应当身兼架构师与问题解决者这两大角色。

有时候我的脑袋里会突然出现像“微决议micro-resolutions”这样的念头。基本上,微决议所要探讨的是我应该开始做,但在重要性方面还达不到人生高度的事物。

而在审视过程当中,我发现了一位读者朋友提出的问题。

您提到您自己实际并不喜欢“架构师”这样的头衔。我对此表示赞同,因为架构师这样的词汇在不同企业当中有着不同的意义。

根据我的个人经历,架构师可能需要编写代码、设计UML图表或者单纯只是撰写Word文档。

您难道不觉得开发人员本身就应该是一位身兼架构师与问题解决者两类角色的程序员吗?

就我的职业生活来讲,我担任过这里提到的全部工作岗位,因此我的观点可能在一定程度上存在偏差。不过换个角度来看,我们不妨将问题整理成另外的形式,即“是不是每位开发人员都应当拥有架构师头衔”或者说“是不是每位架构师都应该承担开发者职能”?

在对问题做出这样的简化之后,我给出的答案是肯定的。

是的,每位开发人员都应当是一位身兼架构师与问题解决者两类角色的程序员。另外,每一位开发人员都应当冠有架构师头衔。是的,每位开发人员都应当身负“架构师”职责。说到这里,我不禁想对架构师与开发人员之间的差异进行探讨。

下面来看程序员/软件工程师与架构师之间的区别所在:

  • 关注范围:程序员专注于具体细节,而架构师专注于“宏观视角”。
  • 领导关系:程序员处于被领导地位,架构师则扮演领导角色。
  • 资历背景:架构师的从业时间一般比程序员更长。
  • 气质特性:架构师是重要的梦想家,而程序员则是面向繁琐任务的实干者。
  • 技术取向:架构师做出选择,而程序员提供选项。
  • 技能水准:架构师的技能水平高于程序员。
  • 代码编写:架构师需要编写之代码平均少于开发人员。
  • 组织互动:架构师所参与之“业务”会议数量远多于程序员。
  • 薪酬水准:架构师薪酬水平高于程序员。
  • 自身价值:架构师的价值要高于程序员。

这些就是整个行业对于两者之间区别的看待方式。架构师从业经历更丰富、重要性更高、技术价值更为可观,因此拥有更迫切的市场需求; 而正因为他们太过关键,因此主要精力往往被用于其它事务——而非编写代码——身上。这显然是种混乱的定义方式,甚至自相矛盾,而角色的内在定位模糊性也让我们很难通过一刀切方式作为其评判标准。也正因为如此,某些企业中的架构师会负责构建UML图表,而另一些架构师则干着跟开发人员完全一样的工作。

问题在于,我们往往倾向于用一种笼统的定义来概括实际上极为复杂的概念,而对细微差异的关注缺失则导致定义与实质间存在巨大错位。

事实上,我们的生活稳步前行,每个人都经历过年轻、缺乏经验的起步阶段,并随着时间的推移而逐渐提高、成熟且最终获得源自努力的回报。我们的工作环境认可这种逐步完善的趋势,并立足于唯才是举的制度奖励这种成长。在这条道路上,我们会慢慢迎来属于自己的“资深”以及“首席”等花环,而领导能力则体现为“架构师”、“经理”以及“主管”等头衔当中。头衔等级越高,我们身上肩负的职责与期许就越是重要。另外,在这一推进过程中,我们会不可避免地在领导及业务层面步步上升,并由原本“注重细节”及“勤奋”的青年转型为“着眼于宏观”且“有远见”的管理者。到这时,我们已经不再执行具体的任务,而更多成为“思维领袖”。

在这样的背景之下,“架构师”角色以及“架构师”头衔都有着确切的意义。二者皆是对大家任务执行效果的一种表彰,意味着各位已经成长为较原先更重要、更有价值且更出色的职能角色。这也意味着我们接下来要从事的是不同于以往的工作内容、扮演不同于以往的角色并承担不同于以往的责任。

但如果我们暂时抛开这些价值判断,那么这两种角色之间还有哪些其它差别?

我们可以将这种差异进一步加以具象化,那么此类差异往往广泛存在于各行业及学科当中。一类角色负责制定决策,即着眼于“宏观”而较少“亲自上阵”,而另一类角色则执行更具针对性的任务,负责“亲手”解决问题。说到这里,我们可以将其比作律师事务所中的工作。事务所合伙人负责案件中的重要决策,而其它更具体、更简单的任务则由助理完成。

但需要强调的是,炙手可热的合伙人与看似平凡的助理所负责的工作在本质上并无区别——他们都只是整套业务体系中的运行点之一,负责完成被委以的任务。考虑到这一点,我们可以将同样的道理引入到编程世界当中:经验丰富的开发人员负责制定技术决策(并建立以其为核心的实现体系),编写难度最高以及/或者最为关键的代码片段,同时运营团队并为新晋开发人员们分配他们力所能及的任务。

响应文章开头,每一位开发人员都应当在一定程度成为架构师,或者说每位开发人员都应当同时着眼于软件的宏观定位与具体细节。有些开发者技能水平更高及经验更为丰富(自然也拥有更理想的薪酬待遇),而他们同时也了解应当如何制定技术层面的重要决策并将任务分配给谁来完成。不过从根本角度讲,其角色定义与普通开发人员并无区别——只是其信任层级更高,或者说达到了每位开发者都应达到的信任水平。

如果我构建一支队伍以构建软件解决方案,那么绝对不会刻意寻求两种截然不同的成员:一部分专门作为思维领袖执行广义规划与技术决策,而另一部分负责日常任务与细节工作。最理想的场景是团队里的每位成员都知道该如何解决问题,并通过这两种有所区别的立场与眼光审视问题的定义与细节走向。从另一个角度讲,同时拥有这两种审视能力的开发人员也必将成为企业中的IT摇滚巨星。

我的第一份编程工作始于我19岁的时候,不过,这不是我对IT市场的第一次亲密接触。但是,直到现在我才终于意识到,原来我13岁的时候就做过CTO了

还在我13岁的时候,我的父母就已经在经营一家小企业了。一开始是开杂货店,后来演变成杂货店供应商。约20人在3个不同的地点工作。刚开始我的作用并不大——不过是帮忙处理客户,开验商品,清洁仓库而已。没什么特别。

直到1993年,波兰的工业/经济发生了一个很大的变化。税务部门引进了一种增值税。在这之前,像这类企业的文书工作并不复杂。然而这一税种的到来使得事情发生了很大变化。之前只需在纸上进行的会计事务现在变得如此复杂,以致于需要计算机和软件的协助。

猜猜当时谁是我们公司最好的计算机专家?没错——就是13岁的Andrzej。也就是我。

突然间,我在公司的作用有了显著的变化。我成了CTO(不过那时我并不知道——要是知道的话,我或许会要求一些好处)。我的编程经验接近于0——只是照着编程杂志重新键入BASIC代码到我的Atari800 XL上的这种依瓢画葫芦的行为,并不能当作是真正的编程,对吧?

首先,我们不得不招标——从那些能购买到我们所需软件的人中招标?

我们咨询了不同的销售人员。他们在销售过程中竭力说服13岁的我他们的软件是最好的。但是由于我对对此的相关知识接近于0(即使是现在,我也很难理解增值税,不过这是另一个话题了……),对于编程,我不认识它,它不认识我。销售人员说得很痛苦,而我依然一头雾水。

最后,根据他们的建议,我们选择了一家小公司构建的一个软件。Krzysztof先生是他们唯一的程序员。他成功地兼容了软件和法律(满足主要要求),并且很容易理解,使得一个13岁的孩子也可以使用这个软件。

我们签订了合同,该软件也投入到使用中。Krzysztof先生根据我的要求实施了一些变化,一切各就各位。整个过程真的相当顺利。当时我觉得这是理所当然的。我没有看到任何异常,该软件也能“正常工作”。

我作为CTO的职责被减少到只需要管理一些小的改进,而这些改进通常是通过编程实现的。我也学会了所有重要的技能,例如备份,选择合适的硬件,修理打印机等。

顺便说一句,值得注意的是,制作备份是在5 1/4软盘上的,看上去是这样的:

选择硬件也是一种乐趣。真心要为还只有13岁的我点赞,那个时候我就注意玩游戏要配备什么样的硬盘了。第一台计算机是286 PC,能够运行模拟legendary SimCity 1.0。

白天(刚好学校放暑假)在办公室工作。晚上玩legendary SimCity。

白天,我用软件销售我们的产品给客户。我懂得如何改进用户界面,并且Krzysztof先生很乐于实现它。他经常来我们公司,带着一大袋行李和一台电脑——他在1993年就已经有一台笔记本电脑了!

有一些变化他其实是在和我交流的时候实现的。他先是打开一个蓝色背景的东西(我认为是Borland Pascal),然后实现变化,编译,将文件复制到软盘上,插入磁盘到我们的计算机,本地复制文件,最后重新启动该软件。看上去是持续的交付,是吧?

于是我自然而然地认为这肯定能工作。而且应当可以工作。程序员的聪明机智加上电脑又不会犯错——不是应该无坚不摧所向披靡的吗?

然而意外发生了。

当时我正在和我们的客户交谈,处理他们的订单。他们特别选购了一种饼干,想放到他们店里销售。我将它添加到软件里,收了钱,打印好了发票。然后像往常一样将出货单交给仓库的员工。看看后面没有客户了,于是我登陆了legendary SimCity。

突然,客户又回来了。她说我犯了一个错误。他们想要的是饼干,但拿到的却是矿泉水。我看了看发票。是的,上面写的的确是矿泉水。这是怎么回事呢?我敢肯定,我选择的是饼干。再次打开软件,显示订单。饼干在的呀!???

怎么回事呢?

再打印,又变成水了。

究竟是怎么回事呢?

在这一刻我的世界观像大厦一样轰然坍塌。

“Krzysztof先生,这是软件中的错误吗?”

“是的,我很抱歉。现在已经修复好了。”

我对修复并不是太在意。我对道歉也不在乎。

我的感觉就像是失去了一个朋友。

我不想接受程序员也会犯错的事实。

从那天起我对程序员失去了信任。

因为有一就有二。

我怎么能相信那个软件不会再一次让我一个傻瓜一样面对客户?

“爸爸,我觉得我们需要考虑换个软件使用。目前这个是不可信的。”

我矫枉过正了。是的,这是我现在才意识到的。

重要的是,Krzysztof先生的确是个天才程序员。他只犯了这一个错误。之后一些不严重的问题我也已经记不清了。在接下来的几年里,他发布了支持客户端 – 服务器架构的软件(从此,到了晚上我就可以在家里的电脑上玩legendary SimCity,而不必一直待在办公室)。他成功地扩展了软件,以支持不同的地理位置。
我知道有的公司直到今天依然在使用那款精准的软件,是的,没错——22年后的今天!

它依然能够工作。

关于经验教训?

我不认为一个13岁的懵懵懂懂的我能得出任何有用的结论。但是,作为程序员,请务必记住,我们很容易失去客户和用户的信赖。一旦失去了信任要想再重建就会变得很难很难。

社区驱动的软件开发正成为品牌和项目同时成功的新途径。有人忠告你要注意这个涌动的潮流:由于目前GitHub上,有2700多万个项目,社区驱动的开发越来越受到欢迎,由此可见一斑。

那么,你如何才能加入这股席卷全球的大潮呢?

作为RethinkDB的创始人之一,我对此倒有几点想法。RethinkDB是一种可扩展的开源JSON数据库,为实时互联网而设计。我和我的团队与数千名自愿贡献者一道开发了GitHub上表现最出色的数据库。GitHub上的开放沟通渠道帮助我们交付最佳解决方案,并开发出众多行业的公司在使用的一款产品,其中包括几家《财富》500强公司。

我列出了五个具体的方法,你也可以拿来确保自己的项目在GitHub上取得成功,关键在于吸引社区。

1.重视社区

开源关注的不仅仅是许可证和软件开发模式,它更关注的是人员。鼓励用户和维护人员相互合作,推动新想法的传播。你会发现,最抢眼的项目会借助邮件列表、GitHub项目及/或IRC /Slack频道,建立起广大贡献者参与的社区。

2.欢迎新的贡献者

开始一个新项目时,贡献者常常会有畏难情绪,还怕难为情。提供一套贡献代码方面的准则,并使用问题追踪系统issue tracker,重点突出新贡献者很容易处理的故障排除方法,帮助他们打消顾虑,让他们活跃起来。做好必要的基础工作是确保项目成功的关键。比如说,我们推出RethinkDB时,还发布了GitHub问题礼仪指南,帮助用户。

3.感谢贡献者的工作

所有为RethinkDB做贡献的人都是共同开发者,对其在每个项目上的工作拥有所有权。在RethinkDB,我们以多种方式感谢每个贡献者给出的意见。简单而又有效的做法包括:提名表扬、写感谢信或者发些奖品,比如T恤。贡献者帮助我们以多种方式构建RethinkDB,无论是在GitHub上提交合并请求,还是测试新功能或另一项任务;他们每个人理应得到我们的感谢。

4.利用艺术呈现你的想法

艺术能够有效地传达想法,比如就像软件。充分利用图形设计来给你的项目打品牌。(我们聘请了一名专职开发人员来帮忙。)可以考虑设计一个友好的吉祥物(比如GitHub章鱼猫或RethinkDB思想家),帮助你的项目和社区脱颖而出。此外,利用艺术来阐明和传授复杂的想法和指示说明。通过将艺术融入到你的项目,还可以鼓励新的贡献者做出艺术方面的贡献。

5.编制说明文档,防止出现问题

事无巨细地记录项目过程可以避免潜在的问题和困惑。完备的说明文档包括常见问题解答(FAQ)部分、针对常见模式的一套说明以及一组例子。你甚至可以让从事你项目的那些人献计献策,让说明文档成为开源文档。

结束语

要加快吸引自愿软件开发人员组成的社区,为此让他们觉得受到欢迎,给他们分派清晰的任务,并明确完成这些任务的具体方法。最重要的是,贡献者帮助你时,记得要感谢对方。那样,你的项目会因此而蓬勃发展起来。

前言

这篇文章并没有什么高深的技术,只是自己简单的一个历程,以及对github的体验,相信博客园有很多大牛或者即将成为大牛的人,呼吁大家多多开源,共同进步。开始正文。

从我的使用角度来看,github主要有两个功能,一个是代码管理,另一个则是协同开发,之前一直用的是前一个功能,将代码写完之后,及时保存,及时提交,我一直用的是windows桌面版,觉得github真心好用、方便而且操作不难,不过前几天github也宕机过。。。

在去年下半年了做了一些SDN开源控制器ryu的工作,自己修改了ryu拓扑发现的逻辑,书写了源码,关于这个修改的详细介绍可以参见我的博客,这篇文章也得到了中国最大的sdn网络平台,sdnlab的认可和收录。向开源社区贡献的第一个代码便由此展开。 

过程

贡献代码的起因

之前做了一些关于ryu的工作,书写了一些应用,在某次需要建立交大网络拓扑的时候,发现了ryu的拓扑发现能力有较大的局限性(最后经过比较,发现虚拟交换机CPqD的性能比OpenvSwitch也有一定差距),所以修改了ryu拓扑发现原理,之后放在了自己的github中,发表了一些博客,但是阅读和代码使用人数十分有限。

前几天SDN方面的一个牛人,在github上看到了我的工作,提了问题,并鼓励我将这部分代码贡献给ryu,所以激发了我第一次向开源工程贡献代码的想法。

贡献代码的过程

整个过程可以按照:书写代码->提交merge请求->编译检错->通过->。。。,因为目前只进行到了通过这一步,后面的待续,当然这整个过程都可以通过命令行来实现,这里主要说的是客户端。

在1月30号做完了手头的论文相关的工作之后,修改和完善了之前的代码,便开始提交,简述提交的过程:

前文提过,我用的是github Windows上的客户端,如下图,之前已经fork过了ryu项目,并且clone到了本地,所以直接在本地修改代码。

修改之后,github客户端的changes会有提示,然后commit,同步到远程。

之后在guthub网页,自己的branch下,点击New pull request,进行合并,点击view pull request查看详细过程。

之后就会发现持续几分钟的编译过程,主要包括python代码正确性检测,以及最严格的PE8标准,由于之前的代码实在linux和Windows下都有编译的,所以格式有很多问题,包括空格tab键混用,空行白有空格,注释的#后面没有空格,以及类与类之间的空行数这些问题,来回折腾了好几遍,终于得到了如下图所示的编译通过。

在检查通过之后,在发博客前不久看了下github网站上自己commit的状态,发现了一个问题,如下图,即“This branch has conflicts that must be resolved”。


为解决这个问题找了些资料,最终发现是因为ryu的upstream(也就是ryu的最初创建者)commit了一些代码(不论是别人的pull requeest,还是merge等),证据如下图,可以看出osrg,也就是ryu的最初创建维护者,进行了新的merge,而且和自己修改的文件产生了冲突。


解决办法:git fetch或者git clone获取最新版本。

等待审核

目前编译通过,等待进一步的进展。

总结

开源让开发变得简单,开源让我们不再重复造轮子,开源大法好。

 

深度操作系统 15.1——执着前行,从未止步

深度操作系统是一个致力于为全球用户提供美观易用、安全可靠的Linux发行版。

深度操作系统 15.1为修正版本,重点修复了用户反馈的Bug,并集中精力优化系统与扩充应用仓库。值得一提的是,深度应用家族又添新成员——深度云打印!

倾听反馈,完善自身

倾听反馈,完善自身

根据大家通过“深度用户反馈”提交的问题与建议,我们对系统各模块功能进行了修复优化,重点修复以下问题:

任务栏

  • 优化任务栏挂载移动设备时的显示界面
  • 修复任务栏,可能存在的隐藏状态不正确的问题
  • 修复任务栏,部分系统托盘无法显示的问题

启动器

  • 修复启动器新安装应用小蓝点提示不能正常消失的问题
  • 修复程序卸载后,启动器对应的图标没有及时删除的问题

控制中心

  • 新增镜像源测速功能
  • 修复控制中心,在特定情况下无法自动隐藏的问题
  • 修复控制中心主页,在部分机器上不显示头像的问题
  • 修复账户模块,当前登录用户没有高亮标识的问题
  • 优化默认程序模块,新增默认程序图标显示
  • 优化个性化模块,加快首次启动速度
  • 修复网络模块,部分设置无法保存的问题
  • 修复网络模块,部分无线网卡无法正常使用的问题
  • 优化声音模块,去除声音设置时的连续音效
  • 修复声音模块,部分机器上显示为空白的问题
  • 修复电源模块,在部分语言下不能正确设置的问题
  • 修复快捷键模块,设置快捷键被重置为无的问题

其他

  • 完善系统界面的中文翻译
  • 修复部分桌面显示隐藏文件的问题
  • 修复部分情况可能出现的内存泄露问题
  • 修复32位系统不能安装安卓应用的问题 

应用丰富,任你挑选

该版本首次与Valve公司达成合作关系,将预装Steam游戏平台,为您带来众多的游戏大作!

应用丰富,任你挑选

与此同时,深度商店已上架同花顺、为知笔记、Android Studio、阿里旺旺等众多热门应用,并修复以下问题:

  • 新增当前系统不支持应用的过滤提示
  • 优化应用分类的描述与排序
  • 优化部分窗口布局的对齐、文字选中等细节
  • 修复某些低分辨率下窗口不能最大化的问题
  • 修复安装进度动画造成系统卡顿的问题
  • … …

深度云打印,享受智能打印

深度应用家族又添新成员——深度云打印

深度云打印安装演示视频:http://v.youku.com/v_show/id_XMTQ1OTg2Njg4MA

深度云打印是一种全新的企业级打印机解决方案,它利用云端网络与授权机制的有机结合,可助您一劳永逸的解决Linux环境下的打印难题。

同时,深度云打印适用于台式机、笔记本、部分平板电脑以及其它所有已授权的设备。 

简单获取,轻松安装

只需一杯咖啡的时间,即可体验深度操作系统给您带来的无限魅力!

简单获取,轻松安装

请您下载深度操作系统镜像,并观看安装视频教程,借助深度启动盘制作工具即可轻轻松松的将系统安装至您的电脑。

官方下载点:

  • 64位:点此下载 (MD5值:0da35bad8a4bbd17dd62a8e86498294b)
  • 32位:点此下载 (MD5值:90e43c5ad77c706eb90c452a95a38040) 

其他下载点(同步中):

百度云SourceforgeMEGABT下载社区ISO仓库

提示:深度操作系统 15 Alpha2或以上版本可通过“控制中心→系统信息”将系统升级至最新版本。 

崇尚自由,分享快乐

深度操作系统是一款针对普通用户而发行的开源桌面系统,您可自由下载、分发、修改和使用。

欢迎您关注我们的微博微信(深度操作系统)、TwitterFacebook,以第一时间获取最新动态,同时也欢迎您前往我们的论坛,与我们交流和分享您的快乐。

最后,我们郑重感谢为深度操作系统提供测试文档翻译镜像支持的社区团队与企业,感谢你们的无私的贡献,开源有你们更精彩!