Giter VIP home page Giter VIP logo

full-stack-developer's Introduction

What is a Full Stack developer?

Is it reasonable to expect mere morals to have mastery over every facet of the development stack? Probably not, but Facebook can ask for it. I was told at OSCON by a Facebook employee that they only hire ‘Full Stack’ developers. Well, what does that mean?

To me, a Full Stack Developer is someone with familiarity in each layer, if not mastery in many and a genuine interest in all software technology.

Good developers who are familiar with the entire stack know how to make life easier for those around them. This is why I’m so against silos in the work place. Sure, politics and communication challenges get in the way in large organizations. I think the point Facebook is going for with their hiring policy is, if smart people use their heads and their hearts, a better product gets built in less time.

LAYERS OF THE FULL STACK:

  1. Server, Network, and Hosting Environment.
  • This involves understanding what can break and why, taking no resource for granted.
  • Appropriate use of the file system, cloud storage, network resources, and an understanding of data redundancy and availability is necessary.
  • How does the application scale given the hardware constraints?
  • What about multi-threading and race conditions? Guess what, you won’t see those on your development machine, but they can and do happen in the real world.
  • Full stack developers can work side by side with DevOps. The system should provide useful error messages and logging capabilities. DevOps will see the messages before you will, so make them count.
  1. Data Modeling
  • If the data model is flawed, the business logic and higher layers start to need strange (ugly) code to compensate for corner cases the data model doesn’t cover.
  • Full stack developers know how to create a reasonably normalized relational model, complete with foreign keys, indexes, views, lookup tables, etc.
  • Full stack developers are familiar with the concept of non-relational data stores and understand where they shine over relational data stores.
  1. Business Logic
  • The heart of the value the application provides.
  • Solid object oriented skills are needed here.
  • Frameworks might be needed here as well.
  1. API layer / Action Layer / MVC
  • How the outside world operates against the business logic and data model.
  • Frameworks at this level should be used heavily.
  • Full stack developers have the ability to write clear, consistent, simple to use interfaces. The heights to which some APIs are convoluted repel me.
  1. User Interface
  • Full stack developers: a) understand how to create a readable layout, or b) acknowledge they need help from artists and graphic designers. Either way, implementing a good visual design is key.
  • Can include mastery of HTML5 / CSS.
  • JavaScript is the up and coming language of the future and lots of exciting work is being done in the JavaScript world (node, backbone, knockout…)
  1. User Experience
  • Full stack developers appreciate that users just want things to work.
  • A good system doesn’t give its users carpal tunnel syndrome or sore eyes. A full stack developer can step back and look at a process that needs 8 clicks and 3 steps, and get it down to one click.
  • Full stack developers write useful error messages. If something breaks, be apologetic about it. Sometimes programmers inadvertently write error messages that can make people feel stupid.
  1. Understanding what the customer and the business need.
  • Now we are blurring into the line of architect, but that is too much of a hands off role.
  • Full stack developers have a grasp of what is going on in the field when the customer uses the software. They also have a grasp of the business.
Other Pieces of the Puzzle:
  1. Ability to write quality unit tests. By the way, even JavaScript can have unit tests these days.
  2. Understanding of repeatable automated processes for building the application, testing it, documenting it, and deploying it at scale.
  3. An awareness of security concerns is important, as each layer presents its own possible vulnerabilities.
Closing Thoughts:

It is very bad practice to tightly couple code to a specific implementation (library, OS, hardware, etc). Just because a full stack developer understands the entire spectrum doesn’t mean they have license to take shortcuts. Well, actually they do if it is a build and throw away prototype.

Technology start-ups need full stack developers for their versatility! However, as an organization matures, it needs more and more focused skills.

I’m not sure you can call yourself a full stack developer until you have worked in multiple languages, platforms, and even industries in your professional career. Full stack goes beyond a ‘senior engineer’, as it is along the same lines as a polyglot programmer but with a higher view of all the connecting pieces. Note that on my list, only items 3-5 involve writing code.

技术站点

  • Hacker News:非常棒的针对编程的链接聚合网站
  • Programming reddit:同上
  • MSDN:微软相关的官方技术集中地,主要是文档类
  • infoq:企业级应用,关注软件开发领域
  • OSChina:开源技术社区,开源方面做的不错哦
  • cnblogs,51cto,csdn:常见的技术社区,各有专长
  • stackoverflow:IT技术问答网站
  • GitHub:全球最大的源代码管理平台,很多知名开源项目都在上面,如Linux内核,
  • OpenStack等免费的it电子书:http://it-ebooks.info/
  • DevStore:开发者服务商店

不错的书籍

  • 人件
  • 人月神话
  • 代码大全2
  • 计算机程序设计艺术
  • 程序员的自我修养
  • 程序员修炼之道
  • 高效能程序员的修炼(成为一名杰出的程序员其实跟写代码没有太大关系)
  • 深入理解计算机系统
  • 软件随想录
  • 算法导论(麻省理工学院出版社)
  • 离线数学及其应用
  • 设计模式
  • 编程之美
  • 黑客与画家
  • 编程珠玑
  • C++ Prime
  • Effective C++
  • TCP/IP详解
  • Unix 编程艺术
  • 《精神分析引论》弗洛伊德
  • 搞定:无压力工作的艺术

平台工具(都是开源的好东东哦)

  • Redmine/Trac:项目管理平台
  • Jenkins/Jira(非开源):持续集成系统(Apache Continuum,这个是Apache下的CI系统,还没来得及研究)
  • Sonar:代码质量管理平台
  • git,svn:源代码版本控制系统
  • GitLib/Gitorious:构建自己的GitHub服务器
  • gitbook:https://www.gitbook.io/写书的好东西,当然用来写文档也很不错的
  • Travis-ci:开源项目持续集成必备,和GitHub相结合,https://travis-ci.org/
  • 开源测试工具、社区(Selenium、OpenQA.org)
  • Puppet:一个自动管理引擎,可以适用于Linux、Unix以及Windows平台。所谓配置管理系统,就是管理机器里面诸如文件、用户、进程、软件包这些资源。无论是管理1台,还是上万台机器Puppet都能轻松搞定。
  • Nagios:系统状态监控报警,还有个Icinga(完全兼容nagios所有的插件,工作原理,配置文件以及方法,几乎一模一样。配置简单,功能强大)
  • Ganglia:分布式监控系统
  • fleet:分布式init系统

爬虫相关(好玩的工具)

  • Phantomjs
  • berserkJS(基于Phantomjs的改进版本)
  • SlimerJS
  • CasperJS
  • selenium

Web 服务器性能/压力测试工具/负载均衡器

  • http_load: 程序非常小,解压后也不到100K
  • webbench: 是Linux下的一个网站压力测试工具,最多可以模拟3万个并发连接去测试网站的负载能力
  • ab: ab是apache自带的一款功能强大的测试工具
  • Siege: 一款开源的压力测试工具,可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。
  • squid(前端缓存),nginx(负载),nodejs(没错它也可以,自己写点代码就能实现高性能的负载均衡器):常用的负载均衡器
  • Piwik:开源网站访问量统计系统
  • ClickHeat:开源的网站点击情况热力图
  • HAProxy:高性能TCP /HTTP负载均衡器
  • ElasticSearch:搜索引擎基于Lucene
  • Page Speed SDK和YSLOW
  • HAR Viewer: HAR分析工具
  • protractor:E2E(end to end)自动化测试工具

Web 前端相关

  • GRUNT: js task runner
  • Sea.js: js模块化
  • knockout.js:MVVM开发前台,绑定技术
  • Angular.js: 使用超动感HTML & JS开发WEB应用!
  • Highcharts.js,Flot:常用的Web图表插件
  • Raw:非常不错的一款高级数据可视化工具
  • Rickshaw:时序图标库,可用于构建实时图表
  • JavaScript InfoVis Toolkit:另一款Web数据可视化插件
  • Pdf.js,在html中展现pdf
  • ACE,CodeMirror:Html代码编辑器(ACE甚好啊)
  • NProcess:绚丽的加载进度条
  • impress.js:让你制作出令人眩目的内容展示效果(类似的还有reveal)
  • Threejs:3DWeb库
  • Hightopo:基于Html5的2D、3D可视化UI库
  • jQuery.dataTables.js:高度灵活的表格插件
  • Raphaël:js,canvas绘图库,后来发现百度指数的图形就是用它绘出来的
  • director.js:js路由模块,前端路由,Nodejs后端路由等,适合构造单页应用
  • pace.js:页面加载进度条
  • bower:Web包管理器
  • jsnice:有趣的js反编译工具,猜压缩后的变量名 http://www.jsnice.org/
  • D3.js: 是一个基于JavaScript数据展示库(类似的还有P5.js)
  • Zepto.js:移动端替代jQuery的东东,当然也可以使用jquery-mobile.

UI框架:Foundation,Boostrap,Pure,EasyUI,Polymer

前端UI设计师必去的几个网站:Dribbble,awwwards,unmatchedstyle,UIMaker

  • Mozilla 开发者中心:https://developer.mozilla.org/en-US/  - 图标资源:IcoMoon(我的最爱),Themify Icons,FreePik,Glyphiconsart  - Dialog:非常漂亮的对话框  - AdminLTE:github上的一个开源项目,基于Boostrap3的后台管理页面框架  - Respond.js:让不懂爱的IE6-8支持响应式设计  - require.js: js模块加载库  - select2:比chosen具有更多特性的选择框替代库  - AngularUI:集成angular.js的UI库  - normalize.css: 采用了现代化标准让各浏览器渲染出的html保持一致的库  - CreateJS:Html5游戏引擎Less,Compass:简化CSS开发  - emojify.js:用于自动识别网页上的Emoji文字并将其显示为图像  - simditor:一个不错的开源的html编辑器,简洁高效  - Sencha: 基于html5的移动端开发框架  - SuperScrollorama+TweenMax+skrollr:打造超酷的视差滚动效果网页动画  - jquery-smooth-scroll:同上,平滑滚动插件  - Animate.css:实现了各种动画效果的css库  - Emmet:前端工程师必备,ZenCode的前身  - MagicDraw:Uml图工具

大数据处理/数据分析/分布式工具

  • Hadoop:分布式的文件系统,结合其MapReduce编程模型可以用来做海量数据的批处理(Hive,Pig,HBase啥的就不说了),值得介绍的是Cloudera的Hadoop分支CDH5,基于YARN MRv2集成了Spark可直接用于生产环境的Hadoop,对于企业快速构建数据仓库非常有用。

  • Ceph:Linux分布式文件系统(特点:无中心)  - Storm:实时流数据处理,可以看下IBM的一篇介绍 (还有个Yahoo的S4,也是做流数据处理的)  - Spark:大规模流式数据处理(可以应付企业中常见的三种数据处理场景:复杂的批量数据处理(batch data processing);基于历史数据的交互式查询(interactive query);基于实时数据流的数据处理(streaming data processing)),CSND有篇文章介绍的不错

  • Spark Streaming:基于Spark的实时计算框架  -Tachyon:分布式内存文件系统

  • Mesos:计算框架一个集群管理器,提供了有效的、跨分布式应用或框架的资源隔离和共享Impala:新一代开源大数据分析引擎,提供Sql语义,比- Hive强在速度上

  • SNAPPY:快速的数据压缩系统,适用于Hadoop生态系统中

  • Kafka:高吞吐量的分布式消息队列系统

  • ActiveMQ:是Apache出品,最流行的,能力强劲的开源消息总线

  • MQTT:Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分

  • RabbitMQ:记得OpenStack就是用的这个东西吧

  • ZeroMQ:宣称是将分布式计算变得更简单,是个分布式消息队列,可以看下云风的一篇文章的介绍开源的日志收集系统:scribe、chukwa、kafka、flume。这有一篇对比文章

  • Zookeeper:可靠的分布式协调的开源项目

  • Databus:LinkedIn 实时低延迟数据抓取系统

 - 数据源获取:Flume、Google Refine、Needlebase、ScraperWiki、BloomReach

 - 序列化技术:JSON、BSON、Thrift、Avro、Google Protocol Buffers

 - NoSql:Apache Hadoop、Apache Casandra、MongoDB、Apache CouchDB、Redis、BigTable、HBase、Hypertable、Voldemort、Neo4j

 - MapReduce相关:Hive、Pig、Cascading、Cascalog、mrjob、Caffeine、S4、MapR、Acunu、Flume、Kafka、Azkaban、Oozie、Greenplum

 - 数据处理:R、Yahoo! Pipes、Mechanical Turk、Solr/ Lucene、ElasticSearch、Datameer、Bigsheets、TinkerpopNLP自然语言处理:Natural Language Toolkit、Apache OpenNLP、Boilerpipe、OpenCalais

机器学习

 - WEKA  - Mahout  - scikits.learn  - SkyTree

可视化技术

  • GraphViz  - Processing  - Protovis  - Google Fusion Tables  - Tableau  - Highcharts  - EChats(百度的还不错)  - Raphaël.js

•Kettle:开源的ETL工具 •Pentaho:以工作流为核心的开源BI系统 •Mondrian:开源的Rolap服务器 •Oozie:开源hadoop的工作流调度引擎

开源的数据分析可视化工具

  • Weka  - Orange  - KNIME

Cobar:阿里巴巴的MySql分布式中间件

C & C++

  1. Thrift:用来进行可扩展且跨语言的服务的开发(类似的还有个Avro,Google protobuf)。

  2. libevent:是一个事件触发的网络库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue等系统调用管理事件机制。(对了还有个libev呢)

  3. Boost:不多说了,准C++标准库

  4. Ptmalloc\Valgrind\Purify

  5. NetworkServer架构:acceptor->dispatcher->worker(这个不算工具哦)

  6. breakpad:崩溃转储和分析模块,很多crashreport会用到

  7. UI界面相关:MFC、BCG和QT这类的就不说了,高端一点的还有Html和DirectUI技术:libcef(基于chrome内核的,想想使用html5开发页面,还真有点小激动呢)、HtmlLayout、Duilib、Bolt,非C++的,还有node-webkit也不错,集成了node和webkit内核。

游戏开发相关

  • MINA:使用Java开发手游和页游服务器(对了还有Netty,也很猛的,都是基于NIO的)  - HP-Socket:见有有些页游服务器使用这个构建的  - 云风的技术博客:http://blog.codingnow.com/
  • OGRE:大名鼎鼎的3D图形渲染引擎  - OpenVDB:梦工厂C++的特效库,开源的  - cocos2d:跨平台2D游戏引擎  - unity3d:跨平台3D游戏引擎,很火的哦  - Nodejs:也有不少使用它来开发手游和也有服务器(网易的Pomelo就是哦)

日志聚合,分布式日志收集

Scribe:Facebook的(nodejs + scribe + inotify 同步日志)

logstash:强大的日志收集系统,可以基于logstash+kibana+elasticsearch+redis开发强大的日志分析平台

log.io: nodejs开发的实时日志收集系统

RTP,实时传输协议与音视频

RTP,RTCP,RTSP-> librtp,JRTPLIB(遵循了RFC1889标准)

环形缓冲区,实时数据传输用

SDL,ffmpeg,live555,Speex

Red5:用Java开发开源的Flash流媒体服务器。它支持:把音频(MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用。

Python

Eric,Eclipse+pydev,比较不错的Python IDE

PyWin:Win32 api编程包

numpy:科学计算包,主要用来处理大型矩阵计算等,此外还有SciPy,Matplotlib

GUI相关:PyQt,PyQwt

supervisor:进程监控工具

*Java相关

  • 常用的IDE:IntelliJ IDEA,Eclipse,Netbeans  - Web开发相关:Tomcat、Resin、Jetty、WebLogic等,常用的组件Struts,Spring  - HibernateNetty: 异步事件驱动网络应用编程框架,用于高并发网络编程比较好(NIO框架)  - MINA:简单地开发高性能和高可靠性的网络应用程序(也是个NIO框架),不少手游服务端是用它开发的  - jOOQ:java Orm框架Activiti:工作流引擎,类似的还有jBPM、Snaker  - Perfuse:是一个用户界面包用来把有结构与无结构数据以具有交互性的可视化图形展示出来.  - Gephi:复杂网络分析软件, 其主要用于各种网络和复杂系统,动态和分层图的交互可视化与探测开源工具  - Nutch:知名的爬虫项目,hadoop就是从这个项目中发展出来的  - web-harvest:Web数据提取工具  - POM工具:Maven+ArtifactoryNetflix  - Curator:Netflix公司开源的一个Zookeeper client library,用于简化Zookeeper客户端编程  - Akka:一款基于actor模型实现的 并发处理框架  - EclEmma:覆盖测试工具

.net相关

  • Xilium.CefGlue:基于CEF框架的.NET封装,基于.NET开发Chrome内核浏览器  - CefSharp:同上,有一款WebKit的封装,C#和Js交互会更简单  - netz:免费的 .NET 可执行文件压缩工具  - SmartAssembly:变态的.net代码优化混淆工具  - NETDeob0:.net反混淆工具,真是魔高一尺道高一丈啊(还有个de4dot,在GitHub上,都是开源的)  - ILMerge:将所有引用的DLL和exe文件打成一个exe文件  - ILSpy:开源.net程序反编译工具  - Javascript.NET:很不错的js执行引擎,对v8做了封装  - NPOI: Excel操作  - DotRAS:远程访问服务的模块  - WinHtmlEditor: Winform下的html编辑器  - SmartThreadPool:使用C#实现的,带高级特性的线程池  - Snoop: WPF Spy Utility  - Autofac: 轻量级IoC框架  - HtmlAgilityPack:Html解析利器  - Quartz.NET:Job调度  - HttpLib:@CodePlex,简化http请求  - SuperSocket:简化Socket操作,基于他的还有个SuperWebSocket,可以开发独立的WebSocket服务器了  - DocX:未安装Office的情况下操作Word文件  - Dapper:轻量级的ORM类,性能不错  - HubbleDotNet:支持接入数据库的全文搜索系统
  • ZXing.NET:@CodePlex,QR,条形码相关  - Nancy:轻量级Http服务器,做个小型的Web应用可以摆脱IIS喽(Nancy.Viewengines.Razor,可以加入Razor引擎)  - AntiXSS:微软的XSS防御库Microsoft Web Protection  - LibraryJint:JavaScript解释器  - CS-Script:将C#代码文件作为脚本执行  - Jexus:Linux下 高性能、易用、免费的ASP.NET服务器  - Clay:将dynamic发挥的更加灵活,像写js一样写C#  - DynamicJSON:不必定义数据模型获取json数据  - Antlr:开源的语法分析器(归到C#不太合适,其他语言也可以去用)  - SharpPcap:C#版的WinPcap调用端,牛逼的网络包分析库(自带PacketNotNet用于包协议分析)  - Roslyn:C#,VB编译器  - ImageResizer: 服务端自由控制图片大小,真乃神器也,对手机端传小图,PC端传大图,CMS用它很方便  - UI相关:DevExpress, Fluent(Office 07风格), mui(Modern UI for WPF)  - NetSparkle:应用自动更新组件  - ConfuserEx: 开源.net混淆工具  - ServiceStack: 开源高性能Web服务框架,可用于构建高性能的REST服务Expression  - Evaluator:Eval for C#,处理字符串表达式

http://nugetmusthaves.com/

常用工具

 - Fiddler:非常好用的Web前端调试工具,当然是针对底层http协议的,一般情况使用Chrome等自带的调试工具也足够了,特殊情况还得用它去处理  - wireshark:知名的网络数据包分析工具  - PowerCmd:替代Windows Cmd的利器  - RegexBuddy:强大的正则表达式测试工具  - Soure Insight:源代码阅读神器  - SublimeText:程序员最爱的编辑器  - Database.NET:一个通用的关系型数据库客户端,基于.NET 4.0开发的,做简单的处理还是蛮方便的  - Navicat Premium:支持MySql、PostgreSQL、Oracle、Sqlite和SQL Server的客户端,通用性上不如Database.NET,但性能方面比Database.NET好很多,自带备份功能也用于数据库定时备份。  - Synergy : 局域网内一套键盘鼠标控制多台电脑  - DameWare:远程协助工具集(我在公司主要控制大屏幕用)  - Radmin: 远程控制工具,用了一段时间的  - DameWare,还要破解,对Win7支持的不好,还是发现这个好用  - Listary:能极大幅度提高你 Windows 文件浏览与搜索速度效率的「超级神器」

  • Clover:给资源管理器加上多标签  - WinLaunch:模拟Mac OS的Launch工具  - Fritzing:绘制电路图  - LICEcap:gif教程制作git,  - svn:版本控制系统Enigma Virtual Box(将exe,dll等封装成一个可执行程序)  - Open DBDiff(针对SqlServer)数据库同步  - SymmetricDS:数据库同步  - BIEE,Infomatica,SPSS,weka,R语言:数据分析  - CodeSmith,LightSwitch:代码生成  - Pandoc:Markdown转换工具,出书用的。以前玩过docbook,不过现在还是Markdown盛行啊。  - Window Magnet[Mac]:增强Mac窗口管理功能,想Win7一样具有窗口拖放到屏幕边缘自动调整的功能  - log explorer:查看SqlServer日志dependency  - walker:查询Windows应用程序dll依赖项  - Shairport4w:将iPhone,iPad,iPod上的音频通过AirPlay协议传输到PC上  - ngrok:内网穿透工具Axure:快速原型制作工具,还有个在线作图的工具国内的一个创业团队做的,用着很不错 http://www.processon.com  - tinyproxy:(Linux)小型的代理服务器支持http和https协议EaseUS Partition  - Master:超级简单的分区调整工具,速度还是蛮快的,C盘不够用了就用它从D盘划点空间吧,不用重装系统这么折腾哦。  - CheatEngine:玩游戏修改内存值必备神器(记得我在玩轩辕剑6的时候就用的它,超级方便呢)  - ApkIDE:Android反编译神器翻、墙工具(自|由|门、天行浏览器)

设计工具

  • Sketch
  • OmniGraffle
  • MindManger:思维导图

full-stack-developer's People

Contributors

wangqianfront avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

full-stack-developer's Issues

Node.js给前端带来了什么?

在软件开发领域,前端工程师曾经是一个比较纠结的职业。在Web技术真正发展起来之前的相当长一段时间里,由于技术门槛很低,前端工程师行业一直是鱼龙混杂的状态。其中很多号称是Web开发者的人实际上并没有什么专业的前端技能,有些工作就是被当做简单的力气活由美术设计师顺便做做而已。当时很多人甚至并不认为有朝一日会有这么一群人用HTML、CSS和JavaScript这三门技术谋生 --- 他们想,这怎么可能呢 --- 这些技术看起来都是如此简单,随随便便混在一起用就哦了,把做这些活看成一种正儿八经的职业简直是笑话。

随着技术发展,JavaScript这门语言在悄然改变人们对前端工作的看法,让一些人从美工页面仔转变为真正的前端工程师。JavaScript,这门很多工程师曾经把它当做玩具而不屑一顾的脚本语言竟然演变成了推动互联网发展的核心驱动力。伴随着越来越多的浏览器的出现使得用HTML和CSS兼容各种浏览器变得越来越难,于是能实现兼容各种浏览器的页面成为了前端工程师的金字招牌,前端职业开始变得炙手可热。
两个独立的UI层

即使Ajax这种技术风靡全球之后,前端工程师的主要工作也都是局限于浏览器窗口之内的。HTML、CSS和JavaScript是前端工程师必须要掌握的三种核心技术,前端同后端的唯一交集仅仅是前端需要确保后端的数据能够以正确合适的格式输出到浏览器上。在某种意义上来说,Web开发有两个UI层,一个是在浏览器里面我们最终看到的,另一个在server端,负责生成和拼接页面。因为传统前端基本上没有办法自主决定server端如何处理数据拼接生成页面,因为数据如何组织,往往是会受到后端工程师所选择的技术框架的影响的,而后端不理解前端的一些需求所以他们选择的时候也就很少会从前端方便的角度进行考虑。

nodejs1

在上面这张图的结构里,浏览器里的UI层是完全归前端工程师管的。服务器端的UI层则是前后端都关心的部分,剩下的部分则是服务端的底层,诸如数据处理、缓存、权限控制和其他核心模块,这些是归后端管的。我们还是回过头来看我们所关心的server端UI层吧,这一层所做的事情通常是拼页面模板以及处理具体的业务交互逻辑。

所以,传统的前后端分工是由前端负责浏览器,而其他浏览器之外的东东统统归由后端负责。前后端的交集server的UI层也是由后端来主导的。这是目前最主流的一种前后端分工方式。
让Node.js来改变这一切

Node.js一发布,立刻在前端工程师中引起了轩然大波,前端工程师们几乎立刻对这一项技术表露出了相当大的热情和期待。上一次一种技术能被整个前端界如此关注那还是在几年之前,那时候Ajax这个概念刚刚被提出来。让JavaScript跑在server端,这个想法简直太棒了。这下我们不用再去学那些什么PHP啦、Ruby啦、Java啦、Scala啦或者其他什么对前端来说奇怪的语言,也可以轻松地将我们的领域扩展到server端,多么美好的前景!

我从来不是一个PHP的爱好者,但是我在Yahoo工作的时候,我不得不使用PHP。为了这份工作,我得忍受花费许多额外的时间去修复由于PHP的**特性导致的坑。对于一直使用Java作为服务端语言的我来说,对PHP实在是很难适应。我相信,也一直坚持认为一种静态类型的语言更加适合用来构建你的业务逻辑的核心部分。因此,虽然我很喜欢JavaScript,但我也不会用它来做所有的事情,比如我绝对不会只用JavaScript来实现一个完整的购物车系统。

对于我来说,Node.js不是一个解决一切问题的银弹,我不会用它来取代server端所有别的语言模块。事实上,Node.js可以做到其他后端语言所能做到的几乎所有的事情,但是我不会这么做。我所认为的比较合适的做法是用Node.js来解决server端UI层的问题,这样我就可以将这一层从后端的其他部分剥离开来。

nodejs2

现在越来越多的公司倾向于采用面向服务(service-oriented)的架构,由后端提供给前端RESTful的接口,这么做是为了更好的做前后端的依赖分离。如果所有的关键业务逻辑都封装成REST调用,就意味着在上层只需要考虑如何用这些REST接口构建具体的应用。那些后端程序员们根本不操心具体数据是如何从一个页面传递到另一个页面的,他们也不用管用户数据更新是通过Ajax异步获取的还是通过刷新页面,当然他们更不关心的是你究竟在用jQuery还是YUI --- 这与他们根本毫无关系嘛。后端程序员真正应该关心的难道不应该是数据如何存储、如何容错以及如何保证安全性吗?

现在我们看看Node.js带来的好处吧,当后端程序员提供了REST服务之后,现在我们前端程序员可以使用Node.js来处理server端的UI层啦,我们可以将通过REST调用拿到的数据随心所欲地进行处理,不管是渲染模板还是直接提供给Ajax,现在我们仅仅用JavaScript一种语言就可以轻松实现这些。至于后端程序员,他们只需要保证数据的正确性,无论他们使用任何一种语言来封装REST调用,都不会对前端造成影响,这样前后端的职责不就被更好地划分了吗?这样分工之后前端的领域就从浏览器小框框里面扩展到了server的UI层,而这一层本来对于后端来说是一件他们做起来不轻松的零碎活儿。
不!这太耸人听闻了!

前端工程师接手之前一直由后端负责的这部分工作不那么容易被后端工程师们理解和接受。尤其是现在还有很多后端工程师认为JavaScript是一种极简单的“玩具语言”,他们将会想如此重要的服务端工作怎么能交给这群看起来不靠谱的人用如此“不严肃”的语言来玩?在我的经验里,这种观念上的冲突是前后端工程师们在是否引入Node.js这一问题上的最大分歧。Server端UI层是前后端的中间地带,而之前通常后端程序员对于这个地带比较有主导权,所以一旦你进入这个本来属于后端主导的领域,争议自然是不可避免的。

实际上放弃传统的角色立场,将server的UI层分给前端,在大型Web架构下是很有意义的。不这么做的话,有时候前端想要从后端要到正确的数据,还不得不关心后端究竟是用什么语言实现的。过去的分工中,那些原本属于核心业务底层考虑的东西会被暴露给server的UI层,而这些问题往往会不小心影响到前端。前端本来不需要关注这些问题,因为前后端所关心的方面根本完全不一样嘛。如果你理解单一职能、责任分离和模块化,你就会理解我所说的,甚至会觉得以前不把server的UI层分给前端实在是很笨。

只可惜,之前Node.js这样的东东不存在,所以当时没有前端合适的技术让前端工程师们自己搞定server的UI层。所以后端的同学们用PHP的人就顺手把UI用PHP的模板实现了,同样的用Java的后端同学也自然而然地用JSP搞定这个问题。这不是前端的同学不愿意去做server的UI,而是因为在之前,没有一种我们熟悉的技术让我们能够搞定这些事情,但是现在不一样了,我们有Node.js了。
结论

我喜欢Node.js,我喜欢由这项技术给前端界带来的更大的发展潜力。我并不认为整个后端完全用Node.js来实现会是一个很好的方案,尽管Node.js完全可以做到这一切。我认为目前Node.js最大的价值是能让前端完全把控整个UI层,不论是浏览器的还是Server端的,做到这一点,我们工作的效率能得到很大的提升。我们前端更擅长于决定数据以何种方式呈现能带给用户更好的体验,而后端则更加了解如何处理数据。在这种新的分工方式下,后端只需要提供合适的数据操作接口,前端自己就能构建漂亮的、有效率的、可用性高的接口,从而实现用户所喜欢的交互。

使用Node.js来搞定server的UI层也将后端工程师从他们不擅长的领域解放了出来。于是我们得到了一个Web开发的灵丹妙药:前后端之间只需要通过数据来交互,这种模型使得两方相互独立,各自都能够快速迭代开发,而只要保证数据接口不变,前后端彼此之间就不会造成任何影响。

果断尝试一下吧,这个方案也许正适合你的团队。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.