leuisken.github.io/posts_2014-2016/2015-07-17-web-dev.html
2016-04-19 16:44:27 +08:00

55 lines
15 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: WEB开发新人指南
labels: ["Web开发"]
description: 如今我们使用的互联网,客户端与服务器端的交互无时无刻不在发生。比如我们在浏览器打开网页,浏览器就是客户端,将网页数据发过来的也就是服务器。其实服务器,并没有什么特别的,也就是一台昼夜不停运转的电脑罢了。
---
<h3>一、首先要知道的</h3>
<p>如今我们使用的互联网客户端与服务器端的交互无时无刻不在发生。比如我们在浏览器打开网页浏览器就是客户端将网页数据发过来的也就是服务器。其实服务器并没有什么特别的也就是一台昼夜不停运转的电脑罢了。每一台入网的机器都会被分配一个ip我们可以通过ipconfig / ifconfig这样的命令知道我们电脑的ip地址。服务器本身运行着服务器程序他们监听着来源于网络的请求并对请求进行响应。</p>
<p>比较常见的服务器程序比如apache / Nginx / IIS等等我们可以通过以下这样的一个小的实验来了解网络中的客户端与服务器是如何进行交互的。</p>
<h4>实验:一个小的局域网</h4>
<p>第一步运行你电脑上的服务器程序以apache为例建议使用xampp / wamp这样的软件包win下一键安装能省不少事。当然喜欢折腾的同学和SA们肯定要一个一个装啦在apache的www目录下放入一些网页文件然后在浏览器的localhost下浏览网页。</p>
<p>第二步在电脑上打开wifi共享软件通过ipconfig / ifconfig命令查看本机在内网的ip让手机连接电脑共享的wifi或者是两者同连一个路由器的wifi在手机浏览器的地址栏输入电脑的ip进入电脑的服务器并浏览网页。</p>
<p>上面的小实验的第二步,就模拟了一个简单的浏览器+服务器系统BS系统也在一定程度上反映了网站基本的访问原理。同时这也是Web前端开发中真机测试移动端页面的一个行之有效的方法当然你也可以通过这种方式实现局域网络的文件共享。</p>
<p>继续深入一步我们在浏览网站的时候很少使用ip直接访问的而是用www.baidu.com这样的域名域名与提供对应服务的服务器的ip地址通过DNS服务器相互对应。我们可以通过ping命令也可以通过一些在线的工具<a href="http://ping.chinaz.com">http://ping.chinaz.com</a>来获取一个网站的ip地址有时候ping出来的ip是不一样的一般和你使用网络的地点有关这主要是为了将对服务器的请求分流减轻服务器的压力保证网站的访问速度比如可以了解一下CDN</p>
<h3>二、开发的过程与设计的艺术</h3>
<p>如何从0建立一个网站这就涉及到软件产品的开发了。一般会有以下几个职位。产品PM负责对软件产品的功能目标用户等许多部分进行一个详细的归纳整理包括前期的功能地位和后期的功能修缮设计UE对用户使用的产品界面、交互方式进行统筹和设计前端FE活跃于客户端的程序员负责使用代码实现设计师的设计并与后端协调数据在客户端的渲染工作后端BE活跃于服务器端的程序员为前端的渲染提供所需的数据系统SA保证开发过程中对于服务器权限的管理与协调以及服务器运行环境的提供同时保证网站在生产环境中的平稳运行。</p>
<p>限于个人能力,我在此仅从前端和后端这两个角度,探讨网站实现的技术细节,其中会涉及许多具体的解决方案,供大家参考。</p>
<p>现在我们从这样的角度去看一个网站我将他分为三层视图层数据层以及控制数据在视图上的显示方式的控制器。举个例子一个留言板他的数据层会包括留言者的留言内容、留言时间、留言者的信息等内容。这些数据就像一张excel表格一样存储在我们的服务器。而我们的用户肯定不希望看到一个简陋的表格他们希望看到的至少是一个界面数据内容被清新美观的显示在我们的浏览器上而这个界面也会随着数据内容的增删修改而做出相应的调整。存储表格数据的就是数据层用户看到的就是视图层让界面随数据产生改变则是控制器的使命。</p>
<p>现在,从技术的角度我们去实现他。首先,前端工程师根据设计师的设计,做出视图层的模板,后端工程师也做好相应的数据存储工作,包括设计创建数据库、数据表等等。现在,基本的工作完成。继续下去,我们则有很多的选择。</p>
<h4>选择一:后端渲染数据到视图。</h4>
<p>这种方法,就是前端将模板交给后端,告诉后端具体在哪个位置放什么样的数据,放的时候有什么具体的要求,剩下的渲染工作完全交给后端处理。这样的方法实现起来门槛低,而且由于服务器计算性能一般情况下强于客户机,后端来刷模板简单粗暴速度快,没有任何争议。缺点是后端工程师由于处理了数据填写的工作,相当于涉及了视图层(即前端)的工作内容,导致分工不够明确;同时,由于是后端更新数据,而后端代码是运行在服务器上的,每次要更新都要刷新页面重新请求一个完整的页面,某种意义上来说,用户体验相对较差。</p>
<h4>选择二:后端将数据生成为小的数据文件,前端获取数据并由前端更新视图。</h4>
<p>这种方法涉及到前端的Ajax。说白了就是在后台异步加载另外一个页面在加载过程中用户不会看到任何变化而加载完成后相当于在前端程序里获取了一个字符串剩下的任务就是将这个字符串解析取出里面的数据并将对应内容渲染到相应的位置上。通过这种方式首先可以保证视图层显示的内容都完全由前端工程师负责分工明确实现了一定程度上的前后端分离同时与服务器交互的文件大小从一整个页面缩小到了一个仅仅包含要更新的数据的小文件交互的量减小带来性能上的提升另外由于交互文件一般使用json这种多数编程语言都可以解析的数据格式不仅可以给网页前端使用也可以给移动端app的前端开发使用统一了接口扩展时减小了工作量。</p>
<h4>选择三单页应用SPA</h4>
<p>我先解释一下单页应用和传统网站相比他更接近于移动端应用程序其核心就是将路由控制在前端工程师的手里。核心技术除了上面的Ajax还有pushState又有人将两者合称为PJAX。</p>
<p>先说什么是路由路由可以理解为你网站域名后面的内容比如www.abc.com/p/123这样的网址后面的/p/123就标明了一个路径。可以类比于我们电脑的磁盘当我在路径的位置输入C:/p/123的时候我希望看到C盘下p文件夹下123文件夹的内容当123变成了456显示的内容应该有些变化。如果456文件夹存在显示该文件夹的内容如果不存在则会弹出错误信息提示不存在。对应我们的网站如果当/p/123变成/p/456的时候也应该给出对应的显示。路由由前端控制的含义就是说网站url的变化与对应的显示由前端处理。你的整个网站实际上只有一个页面前端根据url的变化通过Ajax异步加载需要的数据然后通过pushState操作浏览器的历史记录达到与浏览普通网站同样的效果。</p>
<p>SPA最大的优点大概就是响应速度了。当然使用SPA对前端的技术提出了相对比较高的要求。使用SPA的一般情况是你要做一个类似于安卓app的网站如淘宝的手机站和Gmail都是相当典型的SPA。不过虽然现在SPA很多并不是所有的场景都适合使用SPA的。</p>
<h4>淘宝收藏夹的架构:</h4>
<p>作为访问量如此高的网站淘宝是怎么做的。首先php的后台肯定是担负不起这样的访问量的。在淘宝UED他们介绍了“中途岛”项目基本架构是前端工程师使用Node.js进行模板渲染保证模板的渲染由服务器完成提高效率Node.js访问由java后台封装的高级数据接口而java在访问数据库的时候则是使用C语言来实现最有效率的访问。技术细节可以参考淘宝UED的博客。</p>
<h3>三、项目开发中值得一提的点</h3>
<h4>关于查阅资料和提问:</h4>
<p>遇到问题先问搜索引擎,这我想应该都没有什么意见。用不了谷歌,可以从<a href="http://laod.cn">laod.cn</a>下个hosts翻出去的话方法太多不废话了。</p>
<p>当然了找不到具体问题问人是不可避免的。但是当问题比较复杂的时候比如前端这边处理浏览器兼容问题的时候一定要有在线demo一定要把问题描述的很清楚并且真的是自己解决不了了再问。关于提问的艺术可以看看张鑫旭大神的博客个人非常喜欢强烈推荐前端同学关注<a href="http://www.zhangxinxu.com/wordpress/?p=4772">如何提问才能进阶成为前端大神?</a>,这篇文章对提问需要注意的点说的非常明确,请大家,无论是不是做前端,最好都看看。</p>
<h4>任务进度管理:</h4>
<p>虽然在学校里做东西很少会有严格的工期安排、进度计划这些但是在公司里这些问题肯定是会遇到的。推荐几个工具大家可以了解一下tower和微软的project。</p>
<h4>版本控制:</h4>
<p>几乎没有任何成功的软件项目是一个敲代码敲出来的况且就算是一个人敲代码也应该对自己所做的改动有所记录和备份。在这里我将介绍两种使用git进行版本控制的方式供大家参考。</p>
<h5>分支管理:</h5>
<p>整个项目是一个大的仓库这个大的仓库由于不同的修改而有不同的分支。一般来说有master稳定发布版本 / dev开发中的相对稳定版本 / 开发人员个人分支集中个人的修改这些。一般的工作过程为个人会在个人的分支上修改然后push到dev分支稳定下来的dev分支作为新的版本再合并到master分支。那一部分出了问题就在哪一部分进行修改。git在你每次更新分支的内容时都要求你输入一段描述修改的文字这在将来的版本控制和回退上都会很有帮助。</p>
<h5>仓库管理:</h5>
<p>个人理解其实是扩大化的分支管理项目负责人建立项目仓库项目开发人员fork母仓库做了自己的修改后对母仓库发出pull request申请合并到母仓库。这一方法最大的优点就是方便负责人进行code review保证代码质量同时也可以方便对开发人员的贡献度进行考核。通常公司里会选取这种方式。</p>
<h4>项目的持续集成:</h4>
<p>持续集成大家在学校也很少会接触到,但是当你在公司里,遇到大项目的时候,就肯定会接触到持续集成这方面的需求和工具。个人认为持续集成更像是一种思想,在项目的开发过程中,前端和后端在开发过程中不断的对接,测试样例提前都做好,然后自动化构建项目,自动化测试等等。每当代码库更新(当然,本地构建失败的代码是不允许提交到仓库的)的时候,自动构建脚本、自动测试脚本都会跑出一个更新后的产品给大家看,方便团队中的每一个人掌握项目的情况和目前的进度。</p>
<p>实现这种思想,就需要与之配合的工具,关于持续集成这方面现在在企业中目前还没有“最佳实践”,不过确实有很多前人的经验供咱们借鉴。<a href="/data/best_practice_C.I.pdf">《持续集成最佳实践》</a>里面对于持续集成实践进行了思考,欢迎点击。(感谢原作者高磊的无私分享。)</p>
<h3>四、几点建议</h3>
<p>在学习开发技术的过程中,个人给大家一点建议:</p>
<h4>前期初学的时候,千万不要求多</h4>
<p>道理大家都明白,什么都想学肯定什么都学不好。如果一个人都能学过来,那么我们还搞这么多方向做什么。有些东西,当你需要的时候,自然就会接触到;而那个时候你再学,你肯定是在实际项目中遇到了什么问题。有问题导向的学习是非常有效率的,所以千万不要求多,稳住。</p>
<h4>千万不要刚刚入门就觉得自己什么都会了</h4>
<p>这是我经历过的阶段当时被一位学长拉了回来也是非常幸运。这个阶段你觉得自己清楚很多东西了感觉只要查查资料自己什么都能解决。其实想一想这么多人研究这个领域你怎么可能马上就看透了他呢。每个领域都有很多坑每一个坑也都会有至少一个与之对应的解决方案而处理项目和解决方案是一条漫长的道路。知识是越学越细的本来你以为前端只能写写页面深入学习以后你才会发现js可以写机器人可以调系统API做桌面应用哪怕只是在写页面这部分也有着页面渲染时间、内存泄漏等各种各样的问题和与之对应的层出不穷的解决方案。所以低调前面的路还很长。</p>
<h4>学到一定程度,可以多去看看</h4>
<p>我们知道书本上的知识肯定不是最新的技术在不断的发展。可能你现在用的书上的代码都已经过时到运行不了了。这个其实很正常毕竟做网络这方面怎么可能光靠书来追踪技术呢。所以多去看吧github各种社区、论坛线下的技术交流这些可以给你带来最新鲜的养分。所以世界这么大出去多看看。</p>
<h3>五、结语:</h3>
<p>还记得在看松本行泓的《代码的未来》的时候,里面提到的程序员“无所不能”的自由给我留下了很深的印象。写代码,按照自己的意愿去构建一个产品,一个项目,哪怕再小,依然是自由的。哪怕是在实现别人的需求,可以做好,做精,做出一套最佳的解决方案(没有最佳,只有最适合项目),给别人留下轮子去做好二次开发,依然是自由的,是有意义的。</p>
<p>其实个人觉得,单纯作为新人入门的话,本文的第三部分并没有太大的意义。之所以提及,是希望新人们能够更注重代码之外的效率,从团队合作、项目管理、利于维护和二次开发的角度去反思自己的代码,自己的解决方案,有时候会有更多收获。于是多加一笔,虽然限于个人水平,说的不详细,但也希望抛砖引玉,对大家能有些帮助。</p>