成为一名程序员或真正开发者的标准是什么?笔者认为只要是爱编程并向着自己的目标不断地努力奋斗,终有一天你也会成为一个牛人。还是学生的汪海洋,在大学的前三年就成立了自己的工作室和组建了开发团队,目前已有多款应用在AppStore上架,还创立了济南开源社区…… 我们无法去预知未来,但是从汪海洋的身上看到了他对编程的热爱,对梦想的不懈追求,用血的教训来成就自己一次又一次的华丽变身、证明着自己。今天,他将向大家分享他这一路走来,讲述他与程序员之间的不解之缘。以下为采访全文: 都是因为对编程的爱才会坚持 CSDN:请和大家介绍下你及目前所从事的工作。 汪海洋:目前和同学一起创建ING工作室,专注技术、市场、用户,开发属于自己的原创产品。同时做一些开源方面的工作,希望能够在济南的各大高校推广开放、分享、自由、创造的开源精神。 CSDN:你是如何一步步走上编程之路的? 汪海洋:一开始是跟着马士兵的视频教程学习J2SE和J2EE的开发,后来加入WeeGo工作室,主要涉及的领域是移动互联网应用,两年多的时间承接一些外包项目学习到了很多东西,但是更重要的遇到了一群志同道合的小伙伴们。 最难忘的就是暑假的时候和三位学长一起在工作室通宵赶项目,当时有这么一句话,如果你早上过来看见海洋睡着了,那说明问题已经解决了,如果看见海洋还在码代码,那就遇到大问题了。 当时最开心的事情,莫过于通宵之后一起结伴去肯德基,点上两三个法风烧饼,美美的吃上一顿了。虽然后来这个项目因为我们能力有限,最终未能上线,但是这是我第一次体会到团队开发的乐趣和团队的重要性。也让我逐渐意识到,企业项目和个人应用之间的巨大差距。在团队中,能力只是一个方面,责任意识往往比个人能力更重要。 细细想来,兴趣始终是最好的老师,对编程的热爱让我在编程这条路上走的越来越远。 CSDN:有人说大学的课程大多是无用的,根本不用去上课,对此你怎么看? 汪海洋:一开始我也是持有这样的观点,因为感觉很多课程讲不到重点,对于很多知识点浅尝辄止,不但没有起到启发学生的作用,反而还因为考试和绩点等原因扼杀了许多人对编程的喜爱。 其实现在觉得大学中的很多基础课程还是十分必要的,比如数据结构、编译原理这些,虽然不涉及编程的语法,但是在实际开发的过程中对于理解底层代码、优化性能等方面都有应用。一些非专业的课程对于专业技能可能没有帮助,但是对于人格的培养等方面起到了非常重要的作用。 CSDN:你身上有很多的标签,需要做的事情有很多,你是如何进行时间管理的呢? 汪海洋:我有使用Excel制作个人日程安排的习惯: 首先是一个长期的规划,也就是在这接下来的一个月要做什么,比如完成Hadoop的学习等等; 然后是一个中期的规划,也就是在接下来的一个星期要做的事情,比如星期二上课,星期四团队讨论这种; 最后就是每日的计划,番茄工作室爱好者,从早上起床吃什么到晚上睡前看什么都有一个详细的规划。 当然计划只是理论的最优解,实际执行的情况还是三个字:看心情。很多人也有制定计划的习惯,但是往往坚持不了多久就放弃了。我也经常有这样的问题,毕竟懒惰是人的天性。所以每天晚上我会总结一下当天的收获,比如任务完成进度,未完成的原因。每个星期也有个自我总结,毕竟计划不如变化快,有时候需要对计划做一些调整以提高效率。高效是完成规划的前提,就编程而言我比较喜欢站着写程序,因为站着的时候似乎头脑更清醒一些,让捉急的智商跑的更快一些。感觉效率低下的时候就去倒杯水吃个零食,调整一下状态,有张有弛,把握节奏。 CSDN:你是济南高校开源社区创始人之一,这是一个怎样的社区?以及你对开源有着怎样的一种情感? 汪海洋:OSCU是我和另外三位志同道合的同学一起创建的济南高校开源社区,主要进行开源相关的知识普及、文化宣传以及一些交流活动。现在很多大学生被学分和绩点所限制,而学校本身又是一个十分封闭的群体,所以很多大学生接触到编程只是被动的接受,而却没有主动的去学习和探索,很少有人真正的热爱编程,真正的理解编程。我们希望能让大家接触到更纯粹的程序员的世界,而不是沉浸在自己的圈子里。目前社区刚刚起步,规模只有山东大学软件学院的几个同学,在GitCafe创建了一个开源项目,想多人在线合作一起编写一本Python爬虫教程。我们希望越来越多热爱编程的大学生们能加入我们,分享编程和开源带给我们的快乐。 上个月我们四个人有幸拿到了2014开源技术大会的门票,并在会场见到了蒋老大,Thomas Yao,Larry Wall等仰慕已久的大牛们。那次交流会的印象深刻,让我们感受到国内有许多热爱这项事业的编程爱好者,而大妈的演讲《但行好事,莫问前程》也坚定了我们一行四人做开源的决心。 现在社区还处于刚起步阶段,主要是在各个实验室宣讲Git和开源的相关知识。下一步计划每个月组织一次开源技术交流会,让热爱编程的人一起分享编程的乐趣。我觉得开源让编程又变成了一件纯粹的事情,让更多的人能够专注于编程本身的乐趣。 我移动应用开发之道 CSDN:能否简单介绍下你的移动应用开发经历? 汪海洋:WeeGo工作室负责人,做了两年多的移动应用开发,目前有4款iOS应用在AppStore上架,和团队一起完成了多项外包项目的开发,比如手机游戏《伞公主》,新闻订阅客户端《掌中山大》,手机上的传真软件《PhoneFax》、基于蛐蛐儿音频二维码的《747微信打印机》等等。《747微信打印机》在百盛购物中心、北国先天下购物广场、中华网年会等场合进行了展览。 当然,在两年多的开发经历中,也经常遇到项目失败的情况。比如我第一个参与的比较大型的企业项目,一个蛋糕预定的系统《BonBonPie》,整个团队十余人开发了将近半年,我加进去的时候负责的是一些迭代和测试的收尾工作。但是最后因为学校考试周临近,大家忙于考试,未能及时完成项目开发,导致前期的开发都付诸东流,没能成功上线。也是从这时起,我越来越意识到开发前期的规划和安排,对于整个开发流程来说有着多么重要的意义。 目前正在和ING团队一起做属于自己的原创产品《爱吃什么》,团队规模30人左右,分为前端、后台、iOS、Android、视觉、产品等多个部门,更多关注市场和用户。 在团队工作之余我也喜欢捣腾一些自己感兴趣的东西,比如Python爬虫,当时学习Python是无意中看到开源中国的一篇帖子,讲解如何爬取百度贴吧的楼主发言,当时感觉十分神奇,就去系统的学习了Python并做了一系列的爬虫,其中最有意思的是山东大学的绩点查询系统,糗事百科的离线下载器,看似简单的小工具,在摸索的过程中也学习了很多东西,比如当时觉得很困难的Ajax请求,发现Scrapy这个爬虫框架可以轻轻松松的解决这个问题。还有比如Cocos2D和Unity3D等游戏开发引擎,上手容易,开发便捷,可以分分钟做出一个属于自己的手机游戏。个人开发和团队合作相比,更加的自由,可以学习自己感兴趣的东西并且钻研下去,收获不一样的快乐。 CSDN:你移动应用开发中涉通常用到哪些技术和工具? 汪海洋:因为个人对编程十分感兴趣,所以涉猎的内容也比较广泛。 1. 前端,一开始是手写JS和CSS代码,后来接触到jQuery、BootStrap等框架,开发的效率和质量都有比较大的改善。作为一个半业余的前端开发者,框架的使用既能提高效率又能提高代码质量,是一个不错的选择。 2. 后台,PHP和JSP均有所涉及,有Spring、CodeIgniter等框架的开发经验。CodeIgniter是我接触到的第一款PHP轻量级框架,采用MVC模式,足够的自由也足够的方便。 3. 移动端,移动端主要是iOS开发,在Xcode中使用Objective-C开发一些移动应用。经常去Code4App去学习一些别人写好的代码,对于个人能力的提高很有帮助。iOS是我最喜欢的一个领域,从最初的xib到StoryBoard,从手动管理内存到ARC机制的出现,一点一点的见证着它进步和优化的过程。 4. PC端,主要是C#应用开发,做一些有意思的客户端软件,比如基于蛐蛐儿音频二维码的《747微信打印机》,CMCC自动登陆软件《WLAN精灵》等等。 5. 其他,用Unity3D做过游戏,用Python写过爬虫,用OpenCV做过滤镜,用Axure设计过原型,各种内容都有涉及。 在开发中感触比较深的一点就是,开源类库和软件框架的选择与使用,可以节省大量的开发时间,并且提高代码质量。比如iOS中ASIHTTPRequest类库的使用就可以简化很多网络方面的问题,比如下载和上传文件,同步和异步请求,客户端证书,带宽限制等等。 一般在接触到一个新的功能的时候我会先去Code4App查看有没有相关的项目,然后下载下来,先在Demo中运行,学习一下实现的方法和思路,然后再迁移到自己的应用中。 CSDN:一款应用的的产生要经历哪些流程,其中你认为最难和最重要的是哪一环? 汪海洋:我认为工作室开发移动应用主要分为以下三个步骤: 1. 设计原型:这是看起来最简单,实际上是最重要的一个步骤,因为它直接决定了团队的努力方向。需要根据市场提出需求,并且综合用户体验等多个角度考虑设计出原型。一般我们选择使用Axure来设计原型。这是一个不断调整和修改的步骤,因为如果设计的时候定错了方向,整个团队的开发基本就都白费了,在不断的讨论和修改中最后可以得到一个比较完善的产品设计。 2. 开发阶段:开发主要就是程序员们的事情了,在这个阶段最重要的就是团队的沟通与合作,及时的沟通可以发现问题并且尽快的解决问题。在此期间一般美工会一起进行页面的设计,前期的原型只是一个跳转逻辑和布局的大体规划,而美工的设计则细化到了所有的细节,最终将页面切图交给开发的部门。一般我们使用WorkTile进行团队协作和任务管理。 3. 测试阶段:这也是很关键的一个步骤,比如进行各种非正常人类操作的压力测试,以及针对软件界面和功能的黑盒测试等等。一个成熟的产品应该尽量避免闪退、卡顿这种极不友好的情况出现。 CSDN:在移动应用开发中,我们常见的有移动Web App和原生App,你认为两者在未来将如何发展?且两者间的关系将如何?开发者应如何抉择呢? 汪海洋:先来比较一下两者。 原生App,也就是使用对应的开发语言(比如OC,Java)开发的应用,最大的优点就是执行效率高,运行快,并且可以使用一些移动设备的底层功能,例如摄像头,通讯录之类,与之对应的就是开发成本较高,需要有相关技术的开发人员并且开发多种移动客户端应用。 而移动Web App,也就是使用Web技术(HTML5、JS、CSS3等)开发,最大的优点就是开发速度快,只需要开发一个项目就可以在各种移动设备上使用。而对应的缺点也十分明显了,因为使用的是Web技术,所以只能使用一些有限的移动设备的功能,一些细节比如异步加载、延时加载、离线缓存等功能很难实现,而且各种浏览器的兼容也是一个比较大的问题。 原生App和Web App,各有各的优势。未来的局面很可能依旧像现在这样,二者共同生存。而对于开发者而言,在合适的环境下做出正确的选择,做出真正有价值的产品,这往往才是需要关注的问题。 在条件允许的情况下我会优先选择开发原生App,在人员不够或者着急上线的时候则会先快速提供Web App的,再分别提供原生的版本。 至于二者的选择,应考虑这些问题: 1. 人员和时间是否充裕:在条件允许的情况下,个人感觉还是原生App更优先选择,虽然移动应用Web化的趋势非常明显,但是HTML在移动端还面临着很多问题。 2. 软件的要求是否允许:这个涉及到许多方面,比如性能的需求、预算、对设备的底层功能的使用等等,是否可以选择移动Web App主要取决于软件的需求,移动Web App可以用来开发那种新闻订阅类应用,但是开发其它应用的话在性能始终无法和原生App相比。 CSDN:在应用开发中会接触到多种语言,曾在博客写了一首诗,表达了你对Java的难舍难分之情,你对于编程语言有着怎样的特殊情感? 汪海洋:我觉得每一种编程语言都有自己的性格,而编程就像是和它们心与心交流的过程。 比如C++就像是充满智慧的沉稳老者,思维缜密,每个内存的细节都不能放过,在他面前再资深的开发者都要放低姿态,虚心请教。 Java则像是身形庞大的魔术师,前一秒还在给你写着安卓的应用,下一秒又跑去做网站了,再加上Eclipse这个好朋友,还会帮你指出一些语法上的错误。 Python和Ruby则像是一对好朋友,性格相似,活泼自由,充满了灵性。 对我而言,编程不仅仅是一个兴趣而已,它逐渐成为了生活中不可或缺的一部分。 相信每一段代码都有生命,每一段注释都有故事。 【附】 《Java你好,Java再见》 大学伊始 初次见面 回首往昔 已有两年 当年的我 还是一个懵懂的大学学生 当年的你 只是一门必修的编程语言 多少个不眠的黑夜 多少个安静的白天 我静静的坐在电脑前 照着课本慢慢敲着键 看代码一行两行三行四行连成片 看星星一颗两颗三颗四颗连成线 你是我的眼 让我明白封装之义 多态之炫 你是我的眼 带我领略编程之美 算法之艰 由于篇幅限制,以上只是小诗的前部分。 我的团队管理之道 CSDN:你是济南高校开源社区创始人的,也是学生在线iOS移动开发部负责人,独立完成《掌中山大》、《山大手册》等应用的开发并在AppStore上架。同时,你也是WeeGo工作室的负责人,能否简单介绍你的团队,以及作为一名leader的感受? 汪海洋:其实远远谈不上是Leader,充其量就是个小组长。团队基本都是由大学生组成,年轻充满激情,同时也缺乏经验,所以在开发的过程当中走了不少弯路。刚开始的时候,有一个C#的项目,看起来功能比较简单,就是C#操作WORD和EXCEL生成文档。开发周期四个月基本绰绰有余了,当时负责人也没在意,简单的分工之后让大家各干各的,每个星期例会交流。等到了三个月的时候,因为各种问题耽搁,项目才完成了一半左右,而因为缺乏架构经验,项目的设计非常糟糕,除了当时负责页面的同学基本没人知道自己完成的功能如何添加到项目中去。最终的结果就是提前一个星期宣告项目失败。当时我还不是团队负责人,但是从这件事可以看出合理的规划开发计划,把握开发的节奏,预留弹性时间,及时沟通交流,这些细节对于我们这种小型的开发团队来说非常的重要。 我们通过WorkTile平台来进行团队协作和任务管理 团队开发中最常见的问题就是沟通协作的问题,很多时候因为一些细节疏忽导致的沟通上的不足会严重影响项目开发的进度。在第二年的时候我们不再采用QQ群这种原始的方式,而选择了WorkTile这样专业的团队协作和任务管理平台,合作效率有了明显的改善。 我们团队经常遇到的另一个问题就是时间安排。对于大学生团队的成员,上课和开发这两个部分是个很难权衡的问题。有些人将大部分精力放在学业上,导致项目进展缓慢;而有些人则全身心投入开发,虽然做出了一些产品,但是因为缺乏扎实的基本功,导致学习和开发过程中经常出现障碍。我的建议是在项目开展顺利的时候优先保证必要的课程学习,课余时间集中精力一起做点东西是完全足够的。如果项目接近尾声任务繁重那只能牺牲一些上课学习的时间,项目结束之后及时补上落下的课程。 CSDN:你在从一名开发人员到一个团队管理的过程中,在做团队管理的时候有没有遇到一些困难、一些比较难忘的事情? 汪海洋:一开始很难接受这样一个角色的转变,因为作为开发者更多的关注技术方面,而作为管理者的时候需要考虑的东西要多得多,小到成员的沟通,大到团队的规划,都要有一个统筹安排。 最难忘的应该是我第一次分配团队任务的时候因为过于乐观,给每个人都分了一大堆事情,导致团队会议的时候基本都未能完成任务,后来我把任务按照功能逐渐模块分散,然后按照个人能力分配,并且还会预留一部分的弹性时间,防止一些特殊情况影响进度。 CSDN:对团队而言,每个成员的素质影响着整个团队的质量,对此你有什么心得和体会可分享? 汪海洋:面试的时候,我比较关注成员的成长曲线,而不是现在能力。举个例子,以跑步为例,我关心的是能跑多快,而不是现在跑了多远。我理想的队友是热爱编程的人,他可能现在基本功并不扎实,但是我相信加入我们之后他会有很好的发展。对于已经加进来发现并不能很好的融入集体的人,我一般会避免给他分配一些关键的任务,因为毕竟是一起奋斗的队友,就算技术上不能给予帮助但是精神的支持也是很重要的。 CSDN:要打造一支高效团队具体该怎么做,谈谈你的见解? 汪海洋:我认为主要有三个方面: 首先,要找对人。志同道合,热爱编程,没有什么复杂的利益驱动,越纯粹越好。因为我本身也是一个比较简单的人。 然后,有良好的规划。现在应该做什么,接下来我们要做什么,然后哪些人做哪些工作,这些规划对于一个小型的团队来说十分重要。把握一个好的节奏,是高效的关键所在。 最后就是执行力。说的再好做不到也没用,团队虽小,没有什么例会和制度的约束,但是一些基本的要求还是要有的,不以规矩,不成方圆。 我的未来不是梦 CSDN:你对自己接下来的人生有着怎样的规划? 汪海洋:目前我主要有两个方向,一个是开源,一个是产品。 开源是为程序员服务,想找到更多志同道合的朋友一起交流和分享,追求开放,分享,自由,创造的开源精神。 而产品是为更多的客户服务,专注技术、用户和市场,和团队一起开发真正有价值有意义的产品。 CSDN:你是什么时候接触CSDN的?它对你学习和工作都带来哪些影响?同时,对CSDN有什么建议? 汪海洋:我是从大一的时候接触CSDN,那时候经常上CSDN下载一些Java和C++的代码,后来养成了在CSDN写博客的习惯,开发过程中遇到问题还经常翻一翻自己以前的博客。CSDN给我带来了很多,最重要的是营造了良好的程序员氛围,让我接触了很多有经验的开发者,并且在博客和论坛中学习和交流。 建议的话,话说CSDN改版之后页面变化挺大的,不过博客左上角的导航条加了target=”_blank”之后, 点击导航条打开了新的标签页,挺不习惯的,建议改回去吧。 最后: 第一次接受采访,说实话,深知自己还差得很远,只是和大家一起分享编程过程中的收获,聊一聊编程的故事和自己的理解。我一直觉得我是一个十分幸运的人,很庆幸这两年多的时间加入了一些优秀的团队,遇到了很多志同道合的好朋友,对于现在的一切,抱有一颗感恩的心。热爱编程,尊重代码,相信每一段代码都有生命,每一段注释都有故事,尽心尽力做最好的程序员。 |
|