六年技术人的转行之路
从程序员到产品经理,本文作者收获颇多,借此文对个人经历做个总结和复盘,也希望能够给大家一点思考和启发。
大家好,作者本硕均是计算机专业科班出身,毕业后一直从事软件开发工作,先后经历了Windows开发、Android开发、JAVA接口、微服务及HTML页面相关的开发工作。
本文作为作者从事技术开发工作6年后转岗产品经理的一些经历和心路历程,记录并分享出来给需要的小伙伴参考,仅作为个人的经历总结和复盘思考,欢迎大家留言讨论,一起进步。
在很多年以前,记得刚读大一的时候,第一次上C语言实验课,一段实验代码怎么都运行不出结果来,只好求助旁边看着比较厉害的同学,同学过来看了看错误日志,经过一番分析,准确快速地解决了问题(这个场景相信开发同学在日常工作中很常见)。第一次感觉到人和人之间的差距尽然会这么大,对于自己毫无头绪的问题,别人可以这么游刃有余的解决。
佩服之余,更多的是对自身的反思。有果必有因,经过后面不断的摸索和思考,总结原因可能是没有掌握程序调试的方法技巧;英语底子薄,错误日志读不明白;自身兴趣和态度问题等。
不同原因逐个攻破,在后续的学习工作中,不仅逐步加大了自己对“写代码”“调试代码”的实践能力,还对英语进行了恶补(当时也是为了考过四六级)。
在毕业时不仅编程能力显著提升,英语水平也提高了,最终以63分的英语考研成绩考入了北京某高校读取硕士研究生。
第一次接触商业软件开发是在读研期间,每一个小功能的实现,每一次SVN代码的提交都会让我欣喜若狂。看着自己实现的软件功能被很多人使用,看着自己写的代码在不停地运行,不断地产生数据,内心的成就感油然而生。
自此,未来的几年都是在代码的世界里不断探索,不断去寻求突破和成就感。基于此,在毕业那年顺利进入了一家知名企业担任Android软件开发工程师,自此开始了我的职业生涯。
(工作后的我也将近胖了20斤,可能是有了收入伙食变好了,也或许是到了该发胖的年纪。)
从拿到offer工作近两年后,由于公司大量使用H5页面替代Android原生开发,Android开发任务逐步减少。公司提供了两个转岗JAVA后端开发的名额,我毅然决然地转岗的JAVA后端开发,主要是出于两个原因:第一,我认为Android开发只是一整套系统开发的冰山一角,从事后端开发可以从整个项目的角度去思考,包括整体业务考虑、数据库设计、接口设计开发以及H5页面的实现等;第二,我在读研期间前后端开发工作都有涉及过,转岗只需要很少的时间和学习成本。
事实证明,这次转岗也是非常顺利成功,使我较深入理解了企业级商业软件前后端的开发模式和工作流程,即便是现在作为产品经理,也是受益匪浅。
从开始C语言的学习到逐步入门软件开发行业,然后从单纯的软件开发工作走出来,我走过了近10个年头,也正是因为这样的年龄关口使我不得不重新思考未来的职业规划。从典型的软件开发转岗到产品设计岗,可能是我一条还不错的转型方案。
如果把产品经理工作比喻成建造房子,那么程序员的工作就相当于是建造房子所必须的木工或泥工,而项目经理则相当于是包工头,在规定的时间、地点、人力物力有限的情况下,按质保量完成房屋建造任务。
产品经理重于“想”,程序员重于“做”,程序员总是在不断实现产品经理的idea。
在这个实现过程中,程序员通过选择某种或某几种技术实现产品功能,从而获得功能实现和技术提升的成就感。而产品经理的成就感则来自于一个idea从脑海到落地,从上线和用户服务中获得。
做一个能给用户带来价值或者给企业带来效率提升的产品,将会极大提升产品经理的成就感。
对于一个软件开发者来说,如果只是专注于产品业务和功能模块的实现,而不注意个人技术矩阵的积累,那么在未来的职业生涯发展中可能带来较大的风险。
在我刚参加工作那会,更多的就是关注产品业务,实现产品功能,对软件某些业务模块的理解程度甚至超过当时的一些产品经理。后来,我发现,一些资深工程师不仅懂基本的产品业务,更加厉害的是他们的技术矩阵和学习能力特别强,在工作的时候总是在改进方法,使用新技术,在工作之余也是不断完善自身的技术架构,掌握时下热门应用技术和框架,比如大数据相关技术、微服务系列、docker、一些前端JS框架等。
基于此,我也开始注重个人技术积累,尝试使用新学的技术,并不断自学一些新技术。这样的一个过程,使我极大丰富了自身的技术架构,从开始入门的C/C++/C#语言、到中期的Java语言,Android开发、SSH架构,SSM架构到时下流行的微服务架构、Vue.js,JQuery等前端框架以及linux、数据库等知识都有涉及,这都为我后续的产品经理工作打下了良好的基础。
不记得曾经多少次评审过产品经理JIRA上的需求文件,也曾为了完成需求文件的提问KPI而“被迫”进行提问。绝大部分的程序员都是不太情愿逐字逐句的去看需求文件,他们会觉着产品经理需求文件太啰嗦。
但是,从产品经理的角度看,需求文件描述不到的功能点,又会被开发吐槽,这个锅注定还是要产品经理背。所以,一般靠谱点的产品经理都会在需求文件中尽可能描述全面,细节描述到位。
曾经在老东家做一个智能组卷的需求,有一个新入职不久的产品经理负责这个需求,而我则负责这个需求的具体编码实现。
在做需求评审的时候,我发现他的需求原型上画了筛选条件,按章节/知识点进行匹配组卷,但具体的匹配规则则没办法提供。由于可能不懂数据库相关知识,不了解数据模型的原因,甚至连章节、知识点、试题的对应关系都搞不明白;知识点-试题,是个多对多的关系,章节-试题也是多对多的关系。
鉴于此,最终由我来设计智能组卷匹配方案的规则,上线后很好地满足了一线学校对此功能的需求。组卷匹配方案简单来说就是个加权算法,对每个匹配出来的试题结果进行打分,按分值高低进行优先级排序。
比如,用户选择了三个知识点,则将匹配出来的试题分为以下几类:试题刚好满足知识点要求且只包含这三个知识点(优先级最高)、试题包含知识点但没有全覆盖知识点(覆盖率越高,则优先级越高)、试题超出知识点范围(超出比例越小,则优先级越高),无匹配知识点试题(优先级最低)。
作为一个软件开发者,每做一个功能、一个产品,我都会去思考这个功能、产品到底能够给用户带来什么价值,公司又是如何通过这个产品来变现的,有没有可以替代的方案,新方案是不是可以简化开发流程、节省开发工时或者能提升系统性能,甚至可以提升产品的用户价值。通过对需求文件的深入评审,产品设计得到了较好的改进。
在几年的软件开发过程中,经常负责多个需求的开发对接工作。通过对各个需求文件的工时评估及人员工作分配和管理,到最终的测试上线,让我掌握了基本项目管理能力。当然,我也自学了一些项目管理的理论知识。
同时,作为新员工导师,对新入职员工进行必要的技术及业务流程培训,使我对已有工作进行梳理和总结的同时建立了与新员工的良好友谊,这些革命的友谊也将是未来持续发展的星星之火。
此外,我也积极参与公司号召的技术、业务分享会,也曾作为技术分享主讲人做过公司内部的技术分享会。
转岗产品经理后的工作内容,做过开发的同学相信都比较清楚了,无非就是以下这几个方面:
- 需求收集(来源:竞品分析、运营需求、老板需求、产品迭代改进等);
- 需求分析(去伪存真、优先级划分);
- 产品设计及内部评审(需求提出方、产品同事、分管领导等);
- 需求PRD文档讲解;
- 项目管理(工作量、进度、质量、性能要求等);
- 产品测试与验收;
- 产品上线和数据分析。
在我转岗产品经理近一年的时间里,上面的所有工作我都经历过,也有一些较为丰富的实践经验,也有一些产品方法论沉淀,在此先不展开说明,后续抽空再做个详细记录和总结。
- 与开发人员无障碍沟通,可以准确估算项目工时及兼任项目经理岗位;
- 在需求原型设计时,有效考虑需求技术实现性和性能问题,给开发讲解需求顺畅;
- 较好的需求管理能力,比如需求收集、排序,需求稳定性、版本迭代设计等方面具有较好的能力;
- 具有较好的信息收集能力(如竞品数据分析)和数据分析能力(如统计报表分析)。
- 需要进一步加强组织、协调、沟通能力,很多问题困扰太久,要是能尽早沟通,主动沟通可能就不是个问题;
- 需要走出产品技术实现细节,进一步拓宽知识边界,包括基本的UI、运营知识,行业知识认知等;
- 心态的转变,程序员喜欢做确定的事情,而产品经理做的几乎都是不确定的事情,本身不确定的事情被别人撕,容易出现心理障碍,因此需要摆正心态,积极面对;
- 需要加强产品经理的决策能力,要对需决策内容利弊足够了解,果断裁决,对结果负责。
产品工作的成就感虽然没有程序员敲代码那么强烈,但是产品经理的成就感是更深层次的。一个好的产品设计在满足用户需求和体验的情况下,还能为开发节省大量的工时,为企业节省成本开支。
对我来说,从无到有完成一个产品的设计、开发、上线,并对用户产生价值,这种成就感才是最真实的。
产品经理的工作可以让我更加贴近生活,更多地去思考身边的人和事,而不是只是钻在代码里,两耳不闻窗外事。慢慢地,我发现自己和身边的一切都在改变,因为我们看待事物的观念变了。
关于产品经理工作相关总结,后续我将进一步梳理和记录,期待与各位一起成长。
作者:李生才;联系作者:lscncut@163.com
本文由 @李生才 原创发布于人人都是产品经理,未经许可,禁止转载
题图来自 Unsplash,基于 CC0 协议
jquery 简介
JQuery是继prototype之后又一个优秀的Javascript库。它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF1.5+, Safari 2.0+, Opera 9.0+),jQuery2.0及后续版本将不再支持IE6/7/8浏览器。jQuery使用户能更方便地处理HTML(标准通用标记语言下的一个应用)、events、实现动画效果,并且方便地为网站提供AJAX交互。jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。jQuery能够使用户的html页面保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需要定义id即可。
jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多)。jQuery在2006年1月由美国人John Resig在纽约的barcamp发布,吸引了来自世界各地的众多JavaScript高手加入,由Dave Methvin率领团队进行开发。如今,jQuery已经成为最流行的javascript库,在世界前10000个访问最多的网站中,有超过55%在使用jQuery。
jQuery是免费、开源的,使用MIT许可协议。jQuery的语法设计可以使开发更加便捷,例如操作文档对象、选择DOM元素、制作动画效果、事件处理、使用Ajax以及其他功能。除此以外,jQuery提供API让开发者编写插件。其模块化的使用方式使开发者可以很轻松的开发出功能强大的静态或动态网页。
jQuery,顾名思义,也就是JavaScript和查询(Query),即是辅助JavaScript开发的库。
历史
大概在 1992 年,一家称作 Nombas 的公司开发了一种叫做 C 减减(C-minus-minus,简称 Cmm)的嵌入式脚本语言。Cmm 背后的理念很简单:一个足够强大可以替代宏操作(macro)的脚本语言,同时保持与 C (和 C ++)足够的相似性,以便开发人员能很快学会。这个脚本语言捆绑在一个叫做 CEnvi 的共享软件中,它首次向开发人员展示了这种语言的威力。
Nombas 最终把 Cmm 的名字改成了 ScriptEase,原因是后面的部分(mm)听起来过于消极,同时字母 C “令人害怕”。
当 Netscape Navigator 崭露头角时,Nombas 开发了一个可以嵌入网页中的 CEnvi 的版本。这些早期的试验被称为 Espresso Page(浓咖啡般的页面),它们代表了第一个在万维网上使用的客户端语言。而 Nombas 丝毫没有料到它的理念将会成为万维网的一块重要基石。
当网上冲浪越来越流行时,对于开发客户端脚本的需求也逐渐增大。此时,大部分因特网用户还仅仅通过 28.8 kbit/s 的调制解调器连接到网络,即便这时网页已经不断地变得更大和更复杂。而更加加剧用户痛苦的是,仅仅为了简单的表单有效性验证,就要与服务器进行多次地往返交互。设想一下,用户填完一个表单,点击提交按钮,等待了 30 秒的处理后,看到的却是一条告诉你忘记填写一个必要的字段。
那时正处于技术革新最前沿的 Netscape,开始认真考虑开发一种客户端脚本语言来解决简单的处理问题。
当时工作于 Netscape 的 Brendan Eich,开始着手为即将在 1995 年发行的 Netscape Navigator 2.0 开发一个称之为 LiveScript 的脚本语言,当时的目的是在浏览器和服务器(本来要叫它 LiveWire)端使用它。Netscape 与 Sun 及时完成 LiveScript 实现。
就在 Netscape Navigator 2.0 即将正式发布前,Netscape 将其更名为 JavaScript,目的是为了利用 Java 这个因特网时髦词汇。Netscape 的赌注最终得到回报,JavaScript 从此变成了因特网的必备组件。
因为 JavaScript 1.0 如此成功,Netscape 在 Netscape Navigator 3.0 中发布了 1.1 版。恰巧那个时候,微软决定进军浏览器,发布了 IE 3.0 并搭载了一个 JavaScript 的克隆版,叫做 JScript(这样命名是为了避免与 Netscape 潜在的许可纠纷)。微软步入 Web 浏览器领域的这重要一步虽然令其声名狼藉,但也成为 JavaScript 语言发展过程中的重要一步。
在微软进入后,有 3 种不同的 JavaScript 版本同时存在:Netscape Navigator 3.0 中的 JavaScript、IE 中的 JScript 以及 CEnvi 中的 ScriptEase。与 C 和其他编程语言不同的是,JavaScript 并没有一个标准来统一其语法或特性,而这 3 种不同的版本恰恰突出了这个问题。随着业界担心的增加,这个语言的标准化显然已经势在必行。
2006年1月,jQuery的第一个版本面世,至今已经有10年多了(注:这个时间点是截止至出书时间)。虽然过了这么久,但它依然以其简洁、灵活的编程风格让人一见倾心。在本篇文章中,我们将讲述jQuery的发展历史,让读者对jQuery有更多的了解。
在jQuery迅速发展的同时,一些大的厂商也看中了商机。2009年9月,微软和诺基亚公司正式宣布支持开源的jQuery库,另外,微软公司还宣称他们将把jQuery作为Visual Studio工具集的一部分。他将提供包括jQuery的智能提示、代码片段、示例文档编制等内容在内的功能。微软和诺基亚公司将长期成为jQuery的用户成员,其他成员还有Google,Intel,IBM,Intuit等公司。 2009年1月,jQuery 1.3版发布,它使用了全新的选择符引擎Sizzle,在各个浏览器下全面超越其他同类型JavaScript框架的查询速度,程序库的性能也因此有了极大提升。这一版本的第2个变化就是提供live()方法,使用live()方法可以为当前及将来增加的元素绑定事件,在1.3版之前,如果要为将来增加的元素绑定事件,需要使用livequery插件,而在1.3版中,可以直接用live()方法。 2005年8月,John Resig提议改进Prototype的“Behaviour”库,于是他在blog上发表了自己的想法,并用了3个例子做说明。
当时John的想法很简单:他发现这种语法相对现有的JavaScript库更为简洁。但他没想到的是,这篇文章一经发布就引起了业界的广泛关注。于是John开始认真思考着这件事情(编写语法更为简洁的JavaScript程序库),直到2006年1月14日,John正式宣布以jQuery的名称发布自己的程序库。随之而来的是jQuery的快速发展。 2006年8月,jQuery的第一个稳定版本,并且已经支持CSS选择符、事件处理和AJAX交互。 2007年7月,jQuery 1.1.3版发布,这次小版本的变化包含了对jQuery选择符引擎执行速度的显著提升。从这个版本开始,jQuery的性能达到了Prototype、Mootools以及Dojo等同类JavaScript库的水平。同年9月,jQuery 1.2版发布,它去掉了对XPath选择符的支持,原因是相对于CSS语法它已经变得多余了。这一版能够对效果进行更为灵活的定制,而且借助新增的命名空间事件,也使插件开发变得更容易。同时,jQuery UI项目也开始启动,这个新的套件是作为曾经流行但已过时的Interface插件的替代项目而发布的。jQuery UI中包含大量预定义好的部件(widget),以及一组用于构建高级元素(例如可拖放、拖拽、排序)的工具。
2010年2月,jQuery 1.4.2版发布,它新增了有关事件委托的两个方法:delegate()和undelegate()。delegate()用于替代1.3.2中的live()方法。这个方法比live()来的方便,而且也可以达到动态添加事件的作用。比如给表格的每个td绑定hover事件
特点
1.动态特效
2.AJAX
3.通过插件来扩展
4.方便的工具 – 例如浏览器版本判断
5.渐进增强
6.链式调用
7.多浏览器支持,支持Internet Explorer6.0+、Opera9.0+、Firefox2+、Safari2.0+、Chrome1.0+(在2.0.0中取消了对Internet Explorer6,7,8的支持)
历史版本
jQuery 1.0
(2006年8月):该库的第一个稳定版本,已经具有了对CSS选择符、事件处理和AJAX交互的稳健支持。
jQuery 1.1
(2007年1月):这一版大幅简化了API。许多较少使用的方法被合并,减少了需要掌握和解释的方法数量。
jQuery 1.1.3
(2007年7月):这次小版本变化包含了对jQuery选择符引擎执行速度的显著提升。从这个版本开始,jQuery的性能达到了Prototype、Mootools以及Dojo等同类JavaScript库的水平。
jQuery 1.2
(2007年9月):这一版去掉了对XPath选择符的支持,原因是相对于CSS语法它已经变得多余了。这一版能够支持对效果的更灵活定制,而且借助新增的命名空间事件,也使插件开发变得更容易。
jQuery UI(2007年9月):这个新的插件套件是作为曾经流行但已过时的Interface插件的替代项目而发布的。jQuery UI中包含大量预定义好的部件(widget),以及一组用于构建高级元素(例如可拖放的界面元素)的工具。
jQuery 1.2.6
(2008年5月):这一版主要是将Brandon Aaron开发的流行的Dimensions插件的功能移植到了核心库中。
jQuery 1.3
(2009年1月):这一版使用了全新的选择符引擎Sizzle,库的性能也因此有了极大提升。这一版正式支持事件委托特性。
jQuery 1.3.2
(2009年2月):这次小版本升级进一步提升了库的性能,例如改进了:visible/:hidden选择符、.height()/.width()方法的底层处理机制。另外,也支持查询的元素按文档顺序返回。
jQuery 1.4
(2010年1月14号):对代码库进行了内部重写组织,开始建立一些风格规范。老的core.js文件被分为attribute.js,css.js,data.js,manipulation.js,traversing.js和queue.js;CSS和attribute的逻辑分离。
重要变化:
1. Ajax重写
Ajax模块完全进行了重写。新增一个jXHR对象,为不同浏览器内置的XMLHttpRequest提供了一致的超集。对于XMLHttpRequest之外的传输机制,比如JSONP请求,jXHR对象也可以进行处理。(详情可以参见:jQuery.ajax文档)
此外,系统的可扩展性大大增强,可以附加各种数据处理器、过滤器和传输机制,为开发新的Ajax插件提供了方便。
2. 延迟对象
延迟对象(Deferred Object,jQuery.Deferred对象)是一个可链接的(chainable)实用工具对象,实现了Promise接口,可以在回调队列中注册多个回调、调用回调队列并转发任何同步/异步函数的成败状态。正如Using Deferreds in jQuery 1.5一文中说明的,其结果是在jQuery中能够将依赖于某个任务(事件)结果的逻辑与任务本身解耦了。这一点在JavaScript中其实并不新鲜,Mochikit和Dojo等已经实现有些日子了。由于jQuery 1.5的Ajax模块内置使用了延迟对象,因此通过jQuery编写Ajax程序将自动获得这一功能。
开发人员借此可以使用无法立即获得的返回值(如异步Ajax请求的返回结果),而且第一次能够附加多个事件处理器。
例如,使用了新的jQuery内部Ajax API就可以实现下面的代码了:
// Assign handlers immediately after making the request,// and remember the jxhr object for this request var jxhr = $.ajax({ url: \”example.php\” }) .success(function() { alert(\”success\”); }) .error(function() { alert(\”error\”); }) .complete(function() { alert(\”complete\”); });// perform other work here … // Set another completion function for the request above jxhr.complete(function(){ alert(\”second complete\”); });
此外,使用jQuery.Deferred还可以开发自己的延迟对象。更多详情参见:延迟对象文档。
3. jQuery.sub()
jQuery 1.5提供了一种创建和修改jQuery副本的方式。可以用来添加不向外部公开的方法,或者对jQuery的某些方法进行重新定义以提供新功能,或者提供更好的封装、避免名称空间冲突。当然,也可以用来开发插件,但Resig强烈建议在开发插件之前,先考虑jQuery UI widget工厂。
值得注意的是,sub函数并不提供真正的隔离,所有方法、数据、调用仍然依靠jQuery本身来支持。
4. 遍历性能提高
在新版本中.children(),.prev(),.next()几个常用的遍历函数性能有了显著提高。
5. 内部开发系统
John Resig还特别提到了jQuery团队内部开发系统的两点改变:一是服务器端用Node.js替换了老的Java/Rhino系统,使得团队可以专注于JavaScript环境的新变化;二是所用的代码优化程序从Google Closure切换到UglifyJS,新工具的压缩效果非常令人满意。
使用方法
jQuery可以下载使用,有两个版本的 jQuery 可供下载
Production version – 用于实际的网站中,已被精简和压缩。
Development version – 用于测试和开发(未压缩,是可读的代码)
jQuery 1.8.0版时压缩前后的对比
插件机制
jQuery的官方插件是jQuery UI。开发者可以任意扩展jQuery的函数库或者按照自己的需求开发UI组件。网上已经有数以万计的jQuery插件,覆盖各种各样的需求。例如Ajax辅助、数据表格、动态列表、XML工具、拖曳、cookie处理、弹出层等等。jQuery 的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择,例如ComponentOne Studio for ASP NET Wijmo.
随着jQuery插件在网站建设过程中的使用率不断的增加,所以有必要跟进时代步伐开发出一些新的插件/代码片段,以此来巩固并提高前端用户体验,将用户体验提升到一个新的高度。其中包括Flat jQuery Price Slider、Gmaps jQuery Map Plugin 、FormChimp——MailChimp Ajax plugin for jQuery 等。
控件
jQuery Gantt控件是一个基于原生HTML5/jQuery,功能丰富的控件,该控件真正实现了跨平台,在许多设备和浏览器中无缝的运行。
使用项目甘特图中内置的调度,依赖等功能实现任务分层列表的可视化。
使用资源甘特图实现一个资源利用视图。
使用基于API的jQuery或者基于API的MVC可帮您轻松地安装甘特图并加快应用速度。
可与诸如KnockOut(KO),jQuery.tmpl等流行的jQuery模式一同使用。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。