你們的2016年前端學習計劃是什麼?

2015年結束了,網上各種前端年度總結,發展回顧,2016年的前端技術發展趨勢,不知道各位有為自己制定年度計劃嗎?或者對這方面有何看法嗎?


沒必要追新。基礎很重要:

1、css,html,js(ES5,ES2015,ES2016)遵循標準來學習

2、http,socket等網路協議。

3、數據結構和演算法

4、設計模式,這裡不建議為了設計而學習,多了解,項目多思考。

5、項目抽象,建模,分層的能力。

總之,代碼儘可能不重複,易讀易維護易擴展。

軟能力:

1、溝通能力

2、推動項目可執行,有反饋

3、提高英語能力

4、提煉出自己的學習方法


去年寫了一篇文章《前端演進史》, GitHub - phodal/repractise: RePractise

細細整理了過去接觸過的那些前端技術,發現前端演進是段特別有意思的歷史。人們總是在過去就做出未來需要的框架,而現在流行的是過去的過去發明過的。如,響應式設計不得不提到的一個缺點是:他只是將原本在模板層做的事,放到了樣式(CSS)層來完成

複雜度同力一樣不會消失,也不會憑空產生,它總是從一個物體轉移到另一個物體或一種形式轉為另一種形式。

如果六、七年前的移動網路速度和今天一樣快,那麼直接上的技術就是響應式設計,APP、SPA就不會流行得這麼快。儘管我們可以預見未來這些領域會變得更好,但是更需要的是改變現狀。改變現狀的同時也需要預見未來的需求。

什麼是前端?

維基百科是這樣說的:前端Front-end和後端back-end是描述進程開始和結束的通用辭彙。前端作用於採集輸入信息,後端進行處理。計算機程序的界面樣式,視覺呈現屬於前端。

這種說法給人一種很模糊的感覺,但是他說得又很對,它負責視覺展示。在MVC結構或者MVP中,負責視覺顯示的部分只有View層,而今天大多數所謂的View層已經超越了View層。前端是一個很神奇的概念,但是而今的前端已經發生了很大的變化。

你引入了Backbone、Angluar,你的架構變成了MVP、MVVM。儘管發生了一些架構上的變化,但是項目的開發並沒有因此而發生變化。這其中涉及到了一些職責的問題,如果某一個層級中有太多的職責,那麼它是不是加重了一些人的負擔?

前端演進史

過去一直想整理一篇文章來說說前端發展的歷史,但是想著這些歷史已經被人們所熟知。後來發現並非如此,大抵是倖存者偏見——關注到的都知道這些歷史。

數據-模板-樣式混合

在有限的前端經驗里,我還是經歷了那段用Table來作樣式的年代。大學期間曾經有償幫一些公司或者個人開發、維護一些CMS,而Table是當時幫某個網站更新樣式接觸到的——http://ASP.Net(maybe)。當時,我們啟動這個CMS用的是一個名為aspweb.exe的程序。於是,在我的移動硬碟里找到了下面的代碼。

&


&
&
&
&
&
&
&&&&

&
&
&

雖然,我也已經在HEAD里找到了現代的雛形——DIV + CSS,然而這仍然是一個Table的年代。

&

人們一直在說前端很難,問題是你學過么???

人們一直在說前端很難,問題是你學過么???

人們一直在說前端很難,問題是你學過么???

也許,你也一直在說CSS不好寫,但是CSS真的不好寫么?人們總在說JS很難用,但是你學過么?只在需要的時候才去學,那肯定很難。你不曾花時間去學習一門語言,但是卻能直接寫出可以work的代碼,說明他們容易上手。如果你看過一些有經驗的Ruby、Scala、Emacs Lisp開發者寫出來的代碼,我想會得到相同的結論。有一些語言可以讓寫程序的人Happy,但是看的人可能就不Happy了。做事的方法不止一種,但是不是所有的人都要用那種方法去做。

過去的那些程序員都是真正的全棧程序員,這些程序員不僅僅做了前端的活,還做了資料庫的工作。

Set rs = Server.CreateObject("ADODB.Recordset")
sql = "select id,title,username,email,qq,adddate,content,Re_content,home,face,sex from Fl_Book where ispassed=1 order by id desc"
rs.open sql, Conn, 1, 1
fl.SqlQueryNum = fl.SqlQueryNum + 1

在這個ASP文件里,它從資料庫里查找出了數據,然後Render出HTML。如果可以看到歷史版本,那麼我想我會看到有一個作者將style=""的代碼一個個放到css文件中。

在這裡的代碼里也免不了有動態生成JavaScript代碼的方法:

show_other = "&

人們在不斷地反思這其中複雜的過程,整理了一些好的架構模式,其中不得不提到的是我司Martin Folwer的《企業應用架構模式》。該書中文譯版出版的時候是2004年,那時對於系統的分層是

層次職責表現層提供服務、顯示信息、用戶請求、HTTP請求和命令行調用。領域層邏輯處理,系統中真正的核心。數據層與資料庫、消息系統、事物管理器和其他軟體包通訊。

化身於當時最流行的Spring,就是MVC。人們有了iBatis這樣的數據持久層框架,即ORM,對象關係映射。於是,你的package就會有這樣的幾個文件夾:

|____mappers
|____model
|____service
|____utils
|____controller

在mappers這一層,我們所做的莫過於如下所示的資料庫相關查詢:

@Insert(
"INSERT INTO users(username, password, enabled) " +
"VALUES (#{userName}, #{passwordHash}, #{enabled})"
)
@Options(keyProperty = "id", keyColumn = "id", useGeneratedKeys = true)
void insert(User user);

model文件夾和mappers文件夾都是數據層的一部分,只是兩者間的職責不同,如:

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

而他們最後都需要在Controller,又或者稱為ModelAndView中處理:

@RequestMapping(value = {"/disableUser"}, method = RequestMethod.POST)
public ModelAndView processUserDisable(HttpServletRequest request, ModelMap model) {
String userName = request.getParameter("userName");
User user = userService.getByUsername(userName);
userService.disable(user);
Map& map = new HashMap&();
Map & usersWithRoles= userService.getAllUsersWithRole();
model.put("usersWithRoles",usersWithRoles);
return new ModelAndView("redirect:users",map);
}

在多數時候,Controller不應該直接與數據層的一部分,而將業務邏輯放在Controller層又是一種錯誤,這時就有了Service層,如下圖:

然而對於Domain相關的Service應該放在哪一層,總會有不同的意見:

Domain(業務)是一個相當複雜的層級,這裡是業務的核心。一個合理的Controller只應該做自己應該做的事,它不應該處理業務相關的代碼:

if (isNewnameEmpty == false newuser == null){
user.setUserName(newUsername);
List& myPosts = postService.findMainPostByAuthorNameSortedByCreateTime(principal.getName());

for (int k = 0;k &< myPosts.size();k++){ Post post = myPosts.get(k); post.setAuthorName(newUsername); postService.save(post); } userService.update(user); Authentication oldAuthentication = SecurityContextHolder.getContext().getAuthentication(); Authentication authentication = null; if(oldAuthentication == null){ authentication = new UsernamePasswordAuthenticationToken(newUsername,user.getPasswordHash()); }else{ authentication = new UsernamePasswordAuthenticationToken(newUsername,user.getPasswordHash(),oldAuthentication.getAuthorities()); } SecurityContextHolder.getContext().setAuthentication(authentication); map.clear(); map.put("user",user); model.addAttribute("myPosts", myPosts); model.addAttribute("namesuccess", "User Profile updated successfully"); return new ModelAndView("user/profile", map); }

我們在Controller層應該做的事是:

  1. 處理請求的參數
  2. 渲染和重定向
  3. 選擇Model和Service
  4. 處理Session和Cookies

業務是善變的,昨天我們可能還在和對手競爭誰先推出新功能,但是今天可能已經合併了。我們很難預見業務變化,但是我們應該能預見Controller是不容易變化的。在一些設計裡面,這種模式就是Command模式。

View層是一直在變化的層級,人們的品味一直在更新,有時甚至可能因為競爭對手而產生變化。在已經取得一定市場的情況下,Model-Service-Controller通常都不太會變動,甚至不敢變動。企業意識到創新的兩面性,要麼帶來死亡,要麼佔領更大的市場。但是對手通常都比你想像中的更聰明一些,所以這時開創新的業務是一個更好的選擇

高速發展期的企業和發展初期的企業相比,更需要前端開發人員。在用戶基數不夠、業務待定的情形中,View只要可用並美觀就行了,這時可能就會有大量的業務代碼放在View層:

&
&
&


${errors.username} ${errors.password}
& &
&
&


Woohoo, User &${user.userName}& has been created successfully!
& &
&

不同的情形下,人們都會對此有所爭議,但只要符合當前的業務便是最好的選擇。作為一個前端開發人員,在過去我需要修改JSP、PHP文件,這期間我需要去了解這些Template:

{foreach $lists as $v}
&

  • &[{fun date("Y-m-d",$v["addtime"])}]&&{$v["title"]}&& {/foreach}

    有時像Django這一類,自稱為Model-Template-View的框架,更容易讓人理解其意圖:

    {% for blog_post in blog_posts.object_list %}
    {% block blog_post_list_post_title %}
    &

    {% editable blog_post.title %}
    &
    &

    &{{ blog_post.title }} ? &
    & & {% endeditable %}
    {% endblock %}

    作為一個前端人員,我們真正在接觸的是View層和Template層,但是MVC並沒有說明這些。

    從桌面版到移動版

    Wap出現了,並帶來了更多的挑戰。隨後,解析度從1024x768變成了176×208,開發人員不得不面臨這些挑戰。當時所需要做的僅僅是修改View層,而View層隨著iPhone的出現又發生了變化。

    這是一個短暫的歷史,PO還需要為手機用戶製作一個怎樣的網站?於是他們把桌面版的網站搬了過去變成了移動版。由於網路的原因,每次都需要重新載入頁面,這帶來了不佳的用戶體驗。

    幸運的是,人們很快意識到了這個問題,於是就有了SPA。如果當時的移動網路速度可以更快的話,我想很多SPA框架就不存在了

    先說說jQuery Mobile,在那之前,先讓我們來看看兩個不同版本的代碼,下面是一個手機版本的blog詳情頁:

    &

      {% for blog_post in blog_posts.object_list %}
      & {% editable blog_post.title blog_post.publish_date %}
      &

      &{{ blog_post.title }}&& &{% blocktrans with sometime=blog_post.publish_date|timesince %}{{ sometime }} ago{% endblocktrans %}&
      {% endeditable %}
      & {% endfor %}
      &

      而下面是桌面版本的片段:

      {% for blog_post in blog_posts.object_list %}
      {% block blog_post_list_post_title %}
      {% editable blog_post.title %}
      & &{{ blog_post.title }}&
      &
      {% endeditable %}
      {% endblock %}
      {% block blog_post_list_post_metainfo %}
      {% editable blog_post.publish_date %}
      &