# 擴展篇
### SEO
似乎因為受這篇文章的影響 [http://katemats.com/what-every-programmer-should-know-about-seo/](http://katemats.com/what-every-programmer-should-know-about-seo/) 于是我也覺得我應該寫一個[每個程序員必知之SEO](http://www.phodal.com/blog/every-programmer-should-know-how-seo/),作為一個擅長前端兼SEO的設計師。
#### 搜索引擎是如何工作的
> 如果你有時間,可以讀一下谷歌的框架:
[http://infolab.stanford.edu/~backrub/google.html](http://infolab.stanford.edu/~backrub/google.html)
> 這是一個老的,有些過時紙,但非常平易近人,甚至在我們中間的非白皮書的讀者圖標微笑什么每個程序員都應該知道的關于搜索引擎優化和他們絕對概念的解釋更詳細,我只提一筆帶過。
搜索時發生什么了 ?
- 用戶輸入查詢內容
- 查詢處理以及分詞技術
- 確定搜索意圖及返回相關、新鮮的內容

search-engine-arch
為什么需要SEO ?
這是一個有趣的問題,答案總會來源于`為網站帶來更多的流量`。
### 爬蟲與索引
我們先看看來自谷歌的爬蟲工作的一點內容
> 抓取是 Googlebot 發現新網頁并更新這些網頁以將網頁添加到 Google 索引中的過程。
> 我們使用許多計算機來獲取(或“抓取”)網站上的大量網頁。執行獲取任務的程序叫做 Googlebot(也被稱為漫游器或信息采集軟件)。Googlebot 使用算法來進行抓取:計算機程序會確定要抓取的網站、抓取頻率以及從每個網站中獲取的網頁數量。
> Google 的抓取過程是根據網頁網址的列表進行的,該列表是在之前進行的抓取過程中形成的,且隨著網站管理員所提供的站點地圖數據不斷進行擴充。Googlebot 在訪問每個網站時,會檢測每個網頁上的鏈接,并將這些鏈接添加到它要抓取的網頁列表中。新建立的網站、對現有網站所進行的更改以及無效鏈接都會被記錄下 來,并用于更新 Google 索引。
也就是如原文所說:
> 谷歌的爬蟲(又或者說蛛蛛)能夠抓取你整個網站索引的所有頁。
**為什么谷歌上可以搜索整個互聯網的內容**?因為,他解析并存儲了。而更有意思的是,他會為同樣的內容建立一個索引或者說分類,按照一定的相關性,針對于某個關鍵詞的內容。
PageRank對于一個網站來說是相當重要的,只是這個相比也比較復雜。包括其他網站鏈接向你的網站,以及流量,當然還有域名等等。
### 什么樣的網站需要SEO?
下圖是我的博客的流量來源

What Site Need SEO
正常情況下除了像`騰訊`這類的`QQ空間`自我封閉的網站外都需要SEO,或者不希望泄露一些用戶隱私如`Facebook`、`人人`等等
- 如果你和我的網站一樣需要靠搜索帶來流量
- 如果你只有很少的用戶訪問,卻有很多的內容。
- 如果你是為一個公司、企業工作為以帶來業務。
- 。。。
SEO與編程的不同之處 ?
SEO與編程的最大不同之處在于
編程的核心是技術,SEO的核心是內容。?
內容才是SEO最重要的組成部分,這也就是騰訊復制不了的東西。
### SEO基礎知識
#### 確保網站是可以被索引的
一些常見的頁面不能被訪問的原因
- 隱藏在需要提交的表格中的鏈接
- 不能解析的JavaScript腳本中的鏈接
- Flash、Java和其他插件中的鏈接
- PowerPoint和PDF文件中的鏈接
- 指向被meta Robtots標簽、rel=“NoFollow”和robots.txt屏蔽的頁面的鏈接
- 頁面上有上幾百個鏈接
- frame(框架結構)和iframe里的鏈接
對于現在的網站來還有下面的原因,通過來說是因為內容是動態生成的,而不是靜態的
- 網站通過WebSocket的方法渲染內容
- 使用諸如Mustache之類的JS模板引擎
#### 什么樣的網頁可以被索引
- 確保頁面可以在沒有JavaScript下能被渲染。對于現在JavaScript語言的使用越來越多的情況下,在使用JS模板引擎的時候也應該注意這樣的問題。
- 在用戶禁用了JavaScript的情況下,保證所有的鏈接和頁面是可以訪問的。
- 確保爬蟲可以看到所有的內容。那些用JS動態加載出來的對于爬蟲來說是不友好的
- 使用描述性的錨文本的網頁
- 限制的頁面上的鏈接數量。除去一些分類網站、導航網站之類有固定流量,要不容易被認為垃圾網站。
- 確保頁面能被索引。有一指向它的URL
- URL應該遵循最佳實踐。如blog/how-to-driver有更好的可讀性
#### 在正確的地方使用正確的關鍵詞
- 把關鍵詞放URL中
- 關鍵詞應該是頁面的標簽
- 帶有H1標簽
- 圖片文件名、ALT屬性帶有關鍵詞。
- 頁面文字
- 加粗文字
- Descripiton標簽
### 內容
對于技術博客而言,內容才是最需要考慮的因素。
可以考慮一下這篇文章,雖然其主題是以SEO為主 [用戶體驗與網站內容](http://www.phodal.com/blog/user-experience-writing-web-content/)
不可忽略的一些因素是內容才是最優質的部分,沒有內容一切SEO都是無意義的。
復制內容問題 ?
一個以用戶角度考慮的問題
用戶需要看到多元化的搜索結果 ?
所以對于搜索引擎來說,復制帶來的結果:
- 搜索引擎爬蟲對每個網站都有設定的爬行預算,每一次爬行都只能爬行trpgr頁面數
- 連向復制內容頁面的鏈接也浪費了它們的鏈接權重。
- 沒有一個搜索引擎詳細解釋他們的算法怎樣選擇顯示頁面的哪個版本。
于是上文說到的作者給了下面的這些建議:
> 避免從網上復制的內容(除非你有很多其他的內容匯總,以使它看起來不同 - 我們做頭條,對我們的產品頁面的新聞片段的方式) 。這當然強烈適用于在自己的網站頁面以及。內容重復可以混淆搜索引擎哪些頁面是權威(它也可能會導致罰款,如果你只是復制粘貼別人的內容也行) ,然后你可以有你自己的網頁互相競爭排名!
> 如果你必須有重復的內容,利用相對=規范,讓搜索引擎知道哪個URL是一個他們應該被視為權威。但是,如果你的頁面是另一個在網絡上找到一個副本?那么開始想出一些策略來增加更多的文字和信息來區分你的網頁,因為這樣重復的內容是決不可能得到好的排名。
——待續。
#### 保持更新
谷歌對于一個一直在更新的博客來說會有一個好的排名,當然只是相對的。
對于一個技術博客作者來說,一直更新的好處不僅可以讓我們不斷地學習更多的內容。也可以保持一個良好的習慣,而對于企業來說更是如此。如果我們每天去更新我們的博客,那么搜索引擎對于我們網站的收錄也會變得越來越加頻繁。那么,對于我們的排名及點擊量來說也算是一個好事,當我們可以獲得足夠的排名靠前時,我們的PR值也在不斷地提高。
更多內容可以參考:[Google Fresh Factor](http://www.seomoz.org/blog/google-fresh-factor)
#### 網站速度
> 谷歌曾表示在他們的算法頁面加載速度問題,所以一定要確保你已經調整您的網站,都服從最佳做法,以使事情迅速
過去的一個月里,我試著提高自己的網站的速度,有一個相對好的速度,但是受限于`域名解析速度`以及`VPS`。
[網站速度分析與traceroute](http://www.phodal.com/blog/use-traceroute-analyse-person-homepage-speed/)
[UX與網站速度優化——博客速度優化小記](http://www.phodal.com/blog/ux-and-improve-website-load-speed/)
[Nginx ngx_pagespeed nginx前端優化模塊編譯](http://www.phodal.com/blog/nginx-with-ngx-pagespeed-module-improve-website-cache/)
#### 保持耐心
> 這是有道理的,如果你在需要的谷歌機器人抓取更新的頁面,然后處理每一個頁面,并更新與新內容對應的索引的時間因素。
> 而這可能是相當長一段時間,當你正在處理的內容PB級。
SEO是一個長期的過程,很少有網站可以在短期內有一個很好的位置,除非是一個熱門的網站,然而在它被發現之前也會一個過程。
#### 鏈接
在某種意義上,這個是提高PR值,及網站流量的另外一個核心,除了內容以外的核心。
- 鏈接建設是SEO的基礎部分。除非你有一個異常強大的品牌,不需要干什么就能吸引到鏈接。
- 鏈接建設永不停止。這是不間斷營銷網站的過程
關于鏈接的內容有太多,而且當前沒有一個好的方法獲取鏈接雖然在我的網站已經有了
Links to Your Site
Total links
`5,880`
> 同時尋求更多的鏈接是更有利更相關的鏈接可以幫助一樣多。如果你有你的內容的分銷合作伙伴,或者你建立一個小工具,或其他任何人都會把鏈接回你的網站在網絡上 - 你可以通過確保各個環節都有最佳的關鍵字錨文本大大提高鏈路的相關性。您還應該確保所有鏈接到您的網站指向你的主域( http://www.yourdomain.com ,像http://widget.yourdomain.com不是一個子域) 。另外,你要盡可能多的聯系,以包含適當的替代文字。你的想法。
> 另外,也許不太明顯的方式,建立鏈接(或者至少流量)是使用社交媒體 - 所以設置你的Facebook ,Twitter和谷歌,每當你有新的鏈接一定要分享。這些通道也可以作為一個有效的渠道,推動更多的流量到您的網站。
由社交渠道帶來的流量在現在已經越來越重要了,對于一些以內容為主導的網站,而且處于發展初期,可以迅速帶來流量,可以參考一下這篇文章
[尋ta分析與網站內容](http://www.phodal.com/blog/xunta-analytics-and-website-content/)
一些更簡單的辦法就是交換鏈接,總之這個話題有些沉重,可能會帶來一些負面的影響,如黑帽SEO。。。。
**參考來源**:
《SEO藝術》(The Art of SEO)
### 技術的本質
當我開始在閱讀《技術的本質》的時候,我就開始在思考這樣一個問題,我們在使用技術還是工具。

技術的本質
### 技術與工具
在某百科上說
> 一項技術是關于某一領域有效的科學(理論和研究方法)的全部,以及在該領域為實現公共或個體目標而解決設計問題的規則的全部。
對于技術不同的人的理解可能是不同的,和上圖中的使用工具類似的是,和工具一樣,技術也在不斷地成長和進行。網站的成長史似乎可以簡化為下面的過程,可能還會有ASP.NE等等,只是因為我接觸得比較少。
- 靜態的HTML
- CGI和Perl腳本
- PHP
- J2EE
- Django
- Ruby on Rails
- Nodejs
實際上這是技術的一種演變,然而做為最核心的東西HTML似乎還是那樣的。作為新技術產生的核心——HTML也在不斷也進化中。然而,沒有想象中的那么明顯,看上去像是不變的,只是技術在不斷地向前前進。對于我們來說這些都是工具,有時我們在用工具創造中新的工具,好比是技術本身,通過結合一些技術創建出新的技術。同進化史一般,我們沒有辦法從無到有創造出一個新的東西,沒有上帝。
而作為一個普通的程序員,我們所做的只是在使用工具,從芯片到語言,從語言到框架,從框架到實現。
### 編程的秘密
每個人在技術的成長過程中都有不同的經歷,對于我來說現在的總結大概是如此(ps:有興趣可以參考[過去的那些語言](http://www.phodal.com/blog/past-computer-language/))。
- 當我開始學習第一種語言`LOGO`時,我還小覺得很神奇,至少對于計算機還是保持神秘的。
- 當我開始學習**C++**時,由于作者對于其優雅的宣稱,我覺得**C++**確實很優雅、
- 當我開始學習`Python`的時候,我發現**簡單**才是我所要追求的。
- 當我開始學習**Ruby On Rails**的時候,我發現生成可以很強大,但是因為強大,所以沒有意思。
- 當我開始學習`Django`的時候,我發現這才是我想要的訂制。
- 當我開始寫`博客`的時候,我覺得比于**HTML**來說,**Markdown**才是適合我的。
- 當我開始寫下此文時,我開始覺得我**應該試著去做點什么**。
于是我又回到了原點,開始迷茫我想要的是什么?當我實習半年以后,我學到了更多的東西([實習半年后:正在變得高效](http://www.phodal.com/blog/thoughtworks-intern-how-to-be-a-zen-programmer/)),而我開始的時候我才在偶然的一次機會中才了解到,我們用的都是工具。只是,我們可以用工具創造出工具。
編程只是用來解決問題的工具,優美與否對于解決問題的幫助,取決于是一次性問題還是長期問題。編程的核心是解決問題,正如SEO的核心是內容(詳情見:[每個程序員必知之SEO](http://www.phodal.com/blog/every-programmer-should-know-how-seo/))。于是,
> 我們把一個又一個的迷團解開了,剩下百無聊賴。
當我們在討論生產率的時候,得知高級語言會比低級語言來得有生產率,但是效率可能會因人而異。高級語言來自于低級語言,這些似乎沒有那么重要。人們熟悉了不同的IDE、不同的語言,相比于那些入門者來說,諳熟語言的人只是更加熟練罷了。同《賣油翁》的`我亦無他,唯手熟爾`般,對于有些東西只是因為用多了,然后熟悉罷了。事實真的是這樣么?如果我們每天寫的是**1+1=2**,我們會知道**1+2=3**么。
> 那么所謂的優秀的程序員和普通的程序員的差別在哪?
### 技術的成長
這里的技術指的不是個人在技術上的成長,而是技術自身的成長。
> 技術在某種程度上一定是來自此前已有技術的新的組合。
一個優秀的框架、軟件、系統的產生必然會基于其他的已有技術或者框架,如:
Ubuntu GNU/Linux
- 內核是Linux
- 編譯器GCC
- 庫GLIBC等等
- 腳本語言Python等
- Bash
- 等
而這其中的一些小命令如ls、cd、wget也是這個系統的組成部分之一,我們無法找到一個不依賴于其他系統的軟件。如果你自己動手編譯過Linux,或者你會更有體會一個GNU/Linux系統需要什么。從一個庫來說它是基于其他的基本庫,如C標準庫,而從C標準庫的編譯又依賴于編譯器,這些都循環中前進著。
~~~
gcc4.7編譯出了gcc4.8
gcc4.6編譯出了gcc4.7
gcc4.5編譯出了gcc4.6
等等
~~~
這是對一個可以自身編譯自身的編譯器而言,我們無法忽視的是技術背后有許多細節。巨人是站在巨人的肩膀上,過去我們可能一群工程師一個月開發出來的軟件,在今天可能可以由一個工程師一天開發出來。因為我們可以基于前人的經驗及教訓,而這也是所謂的高生產率的程序員和一般的程序員間的區別。
自然而然的優秀的程序員吸收了其他人的經驗以及教訓,換在今天來說,你今天所在的位置并不是因為你比別人聰明,或者是別人比你聰明,只是因為你**吸收了更多的知識及經驗**。當然,教育不公平不應該這邊的討論范圍。