第一篇:yarn學習心得 yarn上的程序開發
yarn學習心得 yarn上的程序開發 概況
YARN是Hadoop系統上的資源統一管理平臺,其主要作用是實現集群資源的統一管理和調度。YARN是一個高速發展中的資源管理與調度平臺,目前還不是很完善,當前只支持CPU和內存的分配。作為資源調度器,YARN支持如下幾個資源調度語義:獲取指定節點的特定資源量,如node1上4個虛擬CPU核,1GB內存(YARN上的資源使用容器包裝);
獲取指定機架上的特定資源量;
支持資源黑名單(添加/刪除);
要求某些應用歸還指定的資源,通常用于搶占場景。
YARN目前不支持的調度語義有(或者說支持得不是很好):獲取任意節點上的特定資源量;
獲取任意機架上的特定資源量;
獲取一組或幾組符合特定規則的資源量;
細粒度資源分配,如獲取主頻大于2.4G的CPU等;
動態調整資源容器容量(對長應用比較重要)。
YARN上的應用按其運行的生命周期長短,可以分為長應用和短應用,短應用通常是分析作業,作業從提交到完成,所耗的時間是有限的,作業完成后,其占用的資源就會被釋放,歸還給YARN進行再次分配。長應用通常是一些服務,應用啟動后除非意外或人為終止,將一直運行下去。長應用通常長期占用集群上的一些資源,且運行期間對資源的需求也時常變化,因此,動態調整資源對長應用來說比較重要。目前,YARN對長應用的支持還不是很好,從社區討論來看,受hortonworks的Hoya項目推動,YARN在2.20版本后加強了對長應用的支持。應用開發
2.1 概述
YARN的應用開發主要過程如下:圖2.1 YARN應用開發流程
YARN主要由ResourceManager和NodeManager組成,ResourceManager負責資源的管理與分配,NodeManager則負責具體資源的隔離。YARN中,資源使用容器進行封裝。用戶在YARN上開發應用時,需要實現如下三個模塊:Application Client: 應用客戶端用于將應用提交到YARN上,使應用運行在YARN上,同時,監控應用的運行狀態,控制應用的運行;
Application Master: AM負責整個應用的運行控制,包括向YARN注冊應用、申請資源、啟動容器等,應用的實際工作在容器中進行;
Application Worker: 應用的實際工作,并不是所有的應用都需要編寫worker。NodeManager啟動AM發送過來的容器,容器內部封裝了該應用worker運行所需的資源和啟動命令。
實現上述模塊,涉及如下2個RPC協議:ApplicationClientProtocol: Client-RM之間的協議,主要用于應用的提交;
ApplicationMasterProtocol: AM-RM之間的協議,AM通過該協議向RM注冊并申請資源;
ContainerManagementProtocol: AM-NM之間的協議,AM通過該協議控制NM啟動容器。
上述協議的定義在hadoop-yarn-api工程中。
從業務的角度看,一個應用需要分兩部分進行開發,一個是接入YARN平臺,實現上述3個協議,通過YARN實現對集群資源的訪問和利用;另一個是業務功能的實現,這個與YARN本身沒有太大關系。下面主要闡述如何將一個應用接入YARN平臺。
2.2 客戶端開發
客戶端開發流程如圖2.2所示:圖2.2 YARN應用程序客戶端開發
從上圖可以看出,客戶端的主要作用是提交(部署)應用和監控應用運行兩個部分。
2.2.1 提交應用
提交應用涉及ApplicationClientProtocol協議中的兩個方法:
GetNewApplicationResponse getNewApplication(GetNewApplicationRequest request)
SubmitApplicationResponse submitApplication(SubmitApplicationRequest request)
具體步驟如下:客戶端通過getNewApplication方法從RM上獲取應用ID;
客戶端將應用相關的運行配置封裝到ApplicationSubmissionContext中,通過submitApplication方法將應用提交到RM上;
RM根據ApplicationSubmissionContext上封裝的內容啟動AM;
客戶端通過AM或RM獲取應用的運行狀態,并控制應用的運行過程。
通過getNewApplication可從RM上獲取全局唯一的應用ID和最大可申請的資源量(內存和虛擬CPU核數),如下所示:圖2.3 getNewApplication方法的輸入輸出
在獲取應用程序ID后,客戶端封裝應用相關的配置到ApplicationSubmissionContext中,通過submitApplication方法提交到RM上。圖2.4 submitApplication方法的輸入輸出
ApplicationSubmissionContext主要包括如下幾個部分:applicationId: 通過getNewApplication獲取的應用ID;
applicationName: 應用名稱,將顯示在YARN的web界面上;
applicationType: 應用類型,默認為”YARN”;
priority: 應用優先級,數值越小,優先級越高;
queue: 應用所屬隊列,不同應用可以屬于不同的隊列,使用不同的調度算法;
unmanagedAM: 布爾類型,表示AM是否由客戶端啟動(AM既可以運行在YARN平臺之上,也可以運行在YARN平臺之外。運行在YARN平臺之上的AM通過RM啟動,其運行所需的資源受YARN控制);
cancelTokensWhenComplete: 應用完成后,是否取消安全令牌;
maxAppAttempts: AM啟動失敗后,最大的嘗試重啟次數;
resource: 啟動AM所需的資源(虛擬CPU數/內存),虛擬CPU核數是一個歸一化的值;
amContainerSpec: 啟動AM容器的上下文,主要包括如下內容:
tokens: AM所持有的安全令牌;
serviceData: 應用私有的數據,是一個Map,鍵為數據名,值為數據的二進制塊;
environment: AM使用的環境變量;
commands: 啟動AM的命令列表;
applicationACLs:應程序訪問控制列表;
localResource: AM啟動需要的本地資源列表,主要是一些外部文件、壓縮包等。
監控應用運行狀態
應用監控涉及ApplicationClientProtocol協議中的如下幾個方法:
//強制殺死一個應用
KillApplicationResponse forceKillApplication(KillApplicationRequest request)
//獲取應用狀態,如進度等
GetApplicationReportResponse getApplicationReport(GetApplicationReportRequest request)
//獲取集群度量
GetClusterMetricsResponse getClusterMetrics(GetClusterMetricsRequest request)
//獲取符合條件的應用的狀態(列表)
GetApplicationsResponse getApplications(GetApplicationsRequest request)
//獲取集群中各個節點的狀態
GetClusterNodesResponse getClusterNodes(GetClusterNodesRequest request)
//獲取RM中的隊列信息
GetQueueInfoResponse getQueueInfo(GetQueueInfoRequest request)
//獲取當前用戶的訪問控制信息
GetQueueUserAclsInfoResponse getQueueUserAcls(GetQueueUserAclsInfoRequest request)
//獲取委托令牌,使得容器可以使用這些令牌與服務通信
GetDelegationTokenResponse getDelegationToken(GetDelegationTokenRequest request)
//更新已存在的委托令牌
RenewDelegationTokenResponse renewDelegationToken(RenewDelegationTokenRequest request)
//需要已存在的委托令牌
CancelDelegationTokenResponse cancelDelegationToken(CancelDelegationTokenRequest request)
客戶端既可以從RM上獲取應用的信息,也可以通過AM獲取。通常為了減少RM的壓力,使用從AM獲取應用運行狀態的方式??蛻舳伺cAM之間的通信使用應用內部的私有協議,與YARN無關。
2.3 AM開發
AM的主要功能是按照業務需求,從RM處申請資源,并利用這些資源完成業務邏輯。因此,AM既需要與RM通信,又需要與NM通信。這里涉及兩個協議,分別是AM-RM協議(ApplicationMasterProtocol)和AM-NM協議(ContainerManagementProtocol),如圖2.5所示:圖2.5 AM-YARN接口協議
2.3.1 AM-RM協議
AM-RM之間使用ApplicationMasterProtocol協議進行通信,該協議提供如下幾個方法: //向RM注冊AM
RegisterApplicationMasterResponse registerApplicationMaster(RegisterApplicationMasterRequest request)
//告知RM,應用已經結束 FinishApplicationMasterResponse finishApplicationMaster(FinishApplicationMasterRequest request)
//向RM申請/歸還資源,維持心跳
AllocateResponse allocate(AllocateRequest request)
客戶端向RM提交應用后,RM會根據提交的信息,分配一定的資源來啟動AM,AM啟動后調用ApplicationMasterProtocol協議的registerApplicationMaster方法主動向RM注冊。完成注冊后,AM通過ApplicationMasterProtocol協議的allocate方法向RM申請運行任務的資源,獲取資源后,通過ContainerManagementProtocol在NM上啟動資源容器,完成任務。應用完成后,AM通過ApplicationMasterProtocol協議的finishApplicationMaster方法向RM匯報應用的最終狀態,并注銷AM。主要過程如圖2.6所示:圖2.6 AM-RM交互流程
需要注意的是,ApplicationMasterProtocol#allocate()方法還兼顧維持AM-RM心跳的作用,因此,即便應用運行過程中有一段時間無需申請任何資源,AM都需要周期性的調用相應該方法,以避免觸發RM的容錯機制。下面具體看一下每一步所傳遞的信息: AM向RM注冊
AM啟動后會主動調用registerApplicationMaster方法向RM注冊,注冊信息中包括該AM所在節點和開放的RPC服務端口,以及一個應用狀態跟蹤Web接口(將在RM的Web頁面上顯示)。RM向AM返回一個對象,里面包含了應用最大可申請的單個容器容量、應用訪控制列表和一個用于與客戶端通信的安全令牌。圖2.7 registerApplicationMaster方法輸入輸出 AM向RM申請資源
AM通過allocate方法向RM申請或釋放資源。AM向RM發送的信息被封裝在AllocateRequest里,包括如下內容:responseId: 相應ID,用于區分重復的響應;
askList:AM向RM申請的資源列表,是一個List
releaseList: AM主動釋放的資源容器列表;
resourceBlacklistRequest: 要添加或刪除的資源黑名單;
progress:應用的運行進度。圖2.8 AllocateRequest
RM接受到AM的請求后,掃描其上的資源鏡像,按照調度算法分配全部或部分申請的資源給AM,返回一個AllocateResponse對象,里面內容包括:responseId: 相應ID,用于區分重復的響應;
numClusterNodes: 集群規模大??;
updatedNodes: 狀態被更新過的所有節點列表,每個節點的狀態更新信息被分裝在NodeReport對象中,包括以下內容:
nodeId: 節點唯一標識;
httpAddress: 節點的Web頁面地址;
rackName: 節點所在機架名;
numContainers: 節點上當前運行的容器個數;
nodeState: 節點運行狀態,是一個枚舉類型;
used: 節點上已經使用的資源量;
capability: 節點總的資源量;
healthReport: 節點的健康診斷信息;
lastHealthReportTime: 最新的節點的健康診斷時戳;
availableResources: 集群的資源凈空量;
AMCommand: RM給AM發送的控制命令,包括重連和關閉;
NMTokens: AM與NM之間的通信令牌;
allocatedContainers: RM新分配給AM的資源容器列表,這些資源被封裝在資源容器(Container)中:
id: 容器ID,每個容器都具有全局唯一的ID;
priority: 優先級;
nodeId: 容器所在節點的ID;
nodeHttpAddress: 節點的Web頁面地址;
containerToken: 容器的安全令牌;
resource: 該容器所持有的資源,包括內存和CPU。
completedContainersStatuses: 已完成的容器狀態列表;
preemptionMessage: 資源搶占信息,包括兩部分,強制收回部分和可自主調配部分:
strictContract: 強制收回部分,AM必須釋放的容器列表;
preemptionContract: 可自主調配的部分,該部分包含了兩個內容,分別是搶占資源需求和可搶占的資源列表,AM需要從可搶占的資源列表中選出部分資源進行釋放,以滿足搶占資源需求;
圖2.9 AllocateResponse AM通知RM應用已結束
在應用完成后,AM通知RM應用結束的消息,同時向RM提供應用的最終狀態(成功/失敗等)、一些失敗時的診斷信息和應用跟蹤地址,RM收到通知后注銷相應的AM,并將注銷結果發送給AM,AM收到注銷成功的消息后,退出進程。AM通過調用ApplicationMasterProtocol#finishApplicationMaster方法通知RM,該方法的輸入輸出如下所示:圖2.10 finishApplicationMaster方法的I/O
2.3.2 AM-NM協議
AM通過ContainerManagementProtocol協議與NM交互,包括3個方面的功能:啟動容器、查詢容器狀態、停止容器,分別對應協議中的三個方法:
//啟動容器
StartContainersResponse startContainers(StartContainersRequest request)
//查詢容器狀態
GetContainerStatusesResponse getContainerStatuses(GetContainerStatusesRequest request)
//停止容器 StopContainersResponse stopContainers(StopContainersRequest request)、AM-NM交互過程如圖2.11所示:圖2.11 AM-NM交互流程 AM在NM上啟動容器
AM通過ContainerManagementProtocol# startContainers()方法啟動一個NM上的容器,AM通過該接口向NM提供啟動容器的必要配置,包括分配到的資源、安全令牌、啟動容器的環境變量和命令等,這些信息都被封裝在StartContainersRequest中。NM收到請求后,會啟動相應的容器,并返回啟動成功的容器列表和失敗的容器列表,同時還返回其上相應的輔助服務元數據。startContainers方法的輸入輸出如圖2.12所示:圖2.12 startContainers的I/O AM查詢NM上的容器運行狀態
在應用運行期間,AM需要實時掌握各個Container的運行狀態,以便及時響應一些異常,如容器運行失敗等。AM通過ContainerManagementProtocol# getContainerStatuses()方法獲取各個容器的運行狀態,其輸入輸出如下圖所示:圖2.13 getContainerStatuses I/O AM停止NM上的容器
當一個容器運行完成后,分配給它的資源需要被回收。AM通過ContainerManagementProtocol#stopContainers()方法停止NM上的容器,釋放相關資源,然后通過AM-RM協議,將釋放的資源上報給RM,RM完成最終的資源回收。stopContainers的輸入輸出如下圖所示:圖2.14 stopContainers I/O
2.4 使用YARN編程庫開發應用
如2.3節所述,YARN上的應用開發分為平臺接入和業務開發兩個部分,其中平臺接入就是實現上述三個RPC協議。直接實現上述協議的開發難度較高,需要處理很多細節和性能問題,如系統并發等。為此,YARN提供了一套應用程序編程庫來簡化應用的開發過程,該編程庫是基于事件驅動機制的,利用了YARN內部的服務庫、事件庫和狀態機庫,分為三個部分,與上述三個協議一一對應。
2.4.1 YARN基礎庫 服務庫
YARN中普遍采用基于服務的對象管理模型,將一些生命周期較長的對應服務化,YARN提供一套抽象的接口對服務進行了統一描述,該服務具有如下特點:具有標準狀態,所有服務都具有4個狀態,NOTINITED、INITED、STARTED、STOPPED;
狀態驅動,服務狀態變化將觸發一些動作,使其轉變成另一種狀態;
服務嵌套,一個服務可以由其他服務組合嵌套而來。
YARN服務庫如下所示:
圖2.15 YARN服務庫 事件庫
YARN中大量采用了基于事件驅動的并發模型,該模型由事件、異步調度器和事件處理器三個模塊組成。處理請求被抽象為事件,放入異步調度器的事件隊列中,調度線程從事件隊列中取出事件分發給不同的事件處理器,事件處理器處理事件,產生新的事件放入事件隊列,如此循環,直到處理完成(完成事件)。圖2.16 YARN事件庫 狀態機庫
YARN中使用{轉換前狀態、轉換后狀態、事件、回調函數}四元組來表示一個狀態變換,一個或多個事件的到來,觸發綁定在對象上狀態轉移函數,使對象的狀態發生變化。狀態機使得事件處理變得簡單可控。圖2.17 狀態機庫
總的來說,YARN中的服務由一個或多個含有有限狀態機的事件處理系統組成,總體框架如下圖所示。圖2.18 YARN服務通用模型
2.4.2 YARN應用客戶端庫(CLIENT-RM編程庫)
YARN的Client-RM編程庫位于org.apache.hadoop.yarn.client.YarnClient(Hadoop-yarn-api項目),該庫實現了通用的ApplicationClientProtocol協議,提供了重試機制。用戶利用該庫可以快速開發YARN應用的客戶端程序,而不需要關心RPC等底層接口。如圖所示:圖2.19 YarnClient
用戶開發自己的應用客戶端時,只要設置好ApplicationSubmissionContext對象,調用YarnClient的相關接口,即可實現應用的提交。
2.4.3 AM-RM編程庫
AM-RM編程庫主要簡化了AM向RM申請資源過程的開發。YARN提供了兩套AM-RM編程庫,分別為阻塞式和非阻塞式模式。如圖2.20所示。圖2.20 AM-RM編程庫
其中,AMRMClient是阻塞式的,實現了ApplicationMasterProtocol協議,用戶調用該類的相應接口,可實現AM與RM的通信。而AMRMClientAsync是AMRMClient的非阻塞式封裝,所有響應通過回調函數的形式返回給用戶,用戶實現自己的AM時,只需要實現AMRMClientAsync的CallbackHandler即可。如圖2.21所示:圖2.21 AM-RM編程庫
2.4.4 NM編程庫
NM編程庫對AM和RM與NM之間的交互進行了封裝,同樣有阻塞式和非阻塞式兩種封裝(AM與NM和RM與NM的交互邏輯相似),如圖2.22所示。圖2.22 NM編程庫
同樣的,對于異步編程庫NMClientAsync,用戶只需要在自己的AM上實現相應的回調函數,就可以控制NM上Container的啟動/停止和狀態監控了。如圖2.23所示。圖2.23 NM編程庫
2.5 總結
本文介紹了YARN平臺應用開發的基本流程,總結如下:YARN平臺應用開發主要有兩個工作:YARN平臺接入和業務邏輯實現;
YARN平臺應用開發主要需要開發三個組件:客戶端、AM和worker;
YARN平臺接入主要涉及三個協議,分別為ApplicationClientProtocol、ApplicationMasterProtocol和ContainerManagementProtocol,其中,客戶端通過ApplicationClientProtocol協議與RM交互,提交(部署)應用并監控應用的運行;AM通過ApplicationMasterProtocol協議維持AM-RM心跳,并向RM申請YARN上的資源;AM通過ContainerManagementProtocol協議控制NM啟動、停止申請到的容器,并監控容器的運行狀態。容器是YARN對資源的封裝,應用的Worker在容器中運行,只能使用容器中的資源,從而實現資源隔離;
YARN提供了Client-RM編程庫、AM-RM編程庫和NM編程庫,從而簡化了YARN上的應用開發(當然還不是很簡單),需要注意的是,該編程庫的接口還不是很穩定,以后還有可能發生變化(hadoop2.0與hadoop2.2.0中YARN的這些編程庫不兼容)。
總得來說,YARN是一個資源管理平臺,并不涉及業務邏輯,具體的業務邏輯需要用戶自己去實現。YARN的核心作用就是分配資源、保證資源隔離。
第二篇:程序開發總結報告
項目開發總結報告
1引言
1.1編寫目的說明編寫這份項目開發總結報告的目的,指出預期的閱讀范圍。
1.2背景
說明:
a. 本項目的名稱和所開發出來的軟件系統的名稱;
b. 此軟件的來源或任務提出者、開發者、用戶及安裝此軟件的計算中心。
1.3定義
列出本文件中用到的專門術語的定義和外文首字母組詞的原詞組。
1.4參考資料
列出收集和用到的參考資料,如:
a. 程序代碼及文檔的來源及出處;
b. 為完成本項目所收集和自學的資料;
c. 本文件中各處所引用的文件、資料,包括所要用到的軟件開發標準。列出這些文件的標題、文件編號、發表日期和出版單位,說明能夠得到這些文件資料的來源。2實際開發結果
2.1產品
說明最終制成的產品,包括:
a. 程序系統中各個程序的名字,它們之間的層次關系,以千字節為單位的各個程序的程序量、存儲媒體的形式和數量;
b. 程序系統共有哪幾個版本,各自的版本號及它們之間的區別; c. 每個文件的名稱;
d. 所建立的每個數據庫。如果開發中制訂過配置管理計劃,要同這個計劃相比較。1
2.2主要功能和性能
逐項列出本軟件產品所實際具有的主要功能和性能,對照可行性研究報告、項目開發計劃、功能需求說明書的有關內容,說明原定的開發目標是達到了、未完全達到、或超過了。
2.3基本流程
用圖給出本程序系統實際的基本處理流程。
2.4研制過程與進度
詳細描述開發程序的完整過程,包括開發的各個階段、制品、活動,并畫出開發流程圖;列出原定計劃進度與實際進度的對比,明確說明,實際進度是提前了、還是延遲了,分析主要原因。
2.5費用
列出原定計劃費用與實際支出費用的對比,包括:
a.工時,以人月為單位,并按不同級別統計;
b.計算機的使用時間,區別CPU時間及其他設備時間;
c.物料消耗、出差費等其他支出。
明確說明,經費是超出了、還是節余了,分析其主要原因。
3開發工作評價
3.1對生產效率的評價
給出實際生產效率,包括:
a. 程序的平均生產效率,即每人月生產的行數;
b. 文件的平均生產效率,即每人月生產的千字數;
并列出原訂計劃數作為對比。
3.2對產品質量的評價
說明在測試中檢查出來的程序編制中的錯誤發生率,即每干條指令(或語句)中的錯誤指令數(或語句數)。如果開發中制訂過質量保證計劃或配置管理計劃,要同這些計劃相比較。
3.3對技術方法的評價
給出對在開發中所使用的技術、方法、工具、手段的評價。
3.4 對主動學習的評價
3.5 對團隊合作的評價
3.6 碰到的問題及其解決方法
給出對于開發中出現的主要問題、原因分析及其解決方法。
4收獲與體會
列出從這項開發工作中所得到的最主要的收獲和體會經驗與教訓
列出從這項開發工作中所得到的最主要的經驗與教訓及對今后的項目開發工作的建議。
第三篇:土地開發程序
第一步 房地產開發公司的設立
第二步 房地產開發項目的立項和可行性研究
房地產開發項目的立項和可行性研究階段的法律程序
1、選定項目,簽定合作意向書
2、初步確定開發方案
3、申報規劃要點
4、申報、審批項目建議書
5、編制項目可行性研究報告
6、申報、審批項目可行性研究報告
房地產開發項目立項和可行性研究階段的相關稅費
1、可行性研究費
2、建設工程規劃許可證執照費
■三者的概念?
《建設用地規劃許可證》是建設單位在向土地管理部門申請征用、劃撥土地前,經城市規劃行政主管部門確認建設項目位置和范圍符合城市規劃的法定憑證,是建設單位用地的法律憑證。沒有此證的用地單位屬非法用地,房地產商的售房行為也屬非法,不能領取房地產權屬證件
《建設用地批準書》是建設單位或者個人的用地申請按照法定程序經批準后.由市、縣人民政府向建設單位或者個人頒發的準予使用建設用地的證件,是建設單位或者個人依法使用土地進行開發建設的法律憑證。按照國家規定,《建設用地批準書》由市、縣人民政府土地行政主管部門負責填寫和頒發。
《國有土地使用證》是證明土地使用者(單位或個人)使用國有土地的法律憑證,受法律保護。
■三者的區別?
1.作用不同。《建設用地規劃許可證》主要管項目的選址、性質、用途等;《建設用地批準書》主要管項目在建設前取得土地的合法性;《國有土地使用證》主要管建筑物、構筑物所有人取得土地使用權的合法性注明。
2.頒發的部門不同?!督ㄔO用地規劃許可證》——規劃部門;《建設用地批準書》——國土部門;《國有土地使用證》——國土部門。
3.頒發的對象不同?!督ㄔO用地規劃許可證》——建設單位;《建設用地批準書》——建設單位或個人;《國有土地使用證》——產權單位或個人。
4.領取的時間不同?!督ㄔO用地規劃許可證》——征收土地前;《建設用地批準書》——項目建設前;《國有土地使用證》——項目建成以后。
第三步 房地產開發項目的規劃設計和市政配套
房地產開發項目規劃設計和市政配套階段的法律程序
一、房地產開發項目的規劃設計
1、申報選址定點
2、申報規劃設計條件
3、委托作出規劃設計方案
4、辦理人防審核
5、辦理消防審核
6、審定規劃設計方案
7、住宅設計方案的專家組審查
8、落實環?!叭龔U”治理方案
9、委托環境影響評價并報批
10、建設工程勘察招、投標
11、委托地質勘探
12、委托初步設計
13、申報、審定初步設計
二、房地產開發項目的市政配套
14、征求主管部門審查意見
15、落實市政公用設施配套方案
16、報審市政配套方案
17、市政各管理部門提出市政配套意見
18、市政管線綜合 房地產開發項目規劃設計和市政配套階段的相關稅費
1、工程勘察(測量)費
2、工程設計費
3、建設工程規劃許可證執照費
4、竣工檔案保證金
5、臨時用地費
6、臨時建設工程費
7、建設工程勘察招標管理費
8、勘察設計監督管理費
9、古建園林工程設計費
第四步 房地產開發項目土地使用權的取得
取得房地產開發項目土地使用權的法律程序
一、國有土地使用權的出讓
1、辦理建設用地規劃許可證
2、辦理建設用地委托釘樁
3、辦理國有土地使用權出讓申請
4、主管部門實地勘察
5、土地估價報告的預審
6、委托地價評估
7、辦理核定地價手續
8、辦理土地出讓審批
9、簽訂國有土地使用權出讓合同
10、領取臨時國有土地使用證
11、領取正式國有土地使用證
12、國有土地使用權出讓金的返還
二、國有土地使用權的劃撥
13、國有土地使用權劃撥用地申請
14、主管部門現場勘察
15、劃撥用地申請的審核、報批
16、取得劃撥用地批準
三、集體土地的征用
17、征用集體土地用地申請
18、到擬征地所在區(縣)房地局立案
19、簽訂征地協議 20、簽訂補償安置協議
21、確定勞動力安置方案
22、區(縣)房地局審核各項協議
23、市政府下文征地
24、交納菜田基金、耕地占用稅等稅費
25、辦理批地文件、批地圖
26、辦理凍結戶口
27、調查戶口核實勞動力
28、辦理農轉工工作
29、辦理農轉居工作 30、辦理超轉人員安置工作
31、地上物作價補償工作
32、征地結案
取得房地產開發項目土地使用權的相關稅費
1、地價款(土地出讓金)
2、資金占用費
3、滯納金
4、土地使用費
5、外商投資企業土地使用費
6、防洪工程建設維護管理費
7、土地閑置費
8、土地權屬調查、地籍測繪費
9、城鎮土地使用稅
10、地價評估費
11、出讓土地預訂金
12、征地管理費
13、土地補償費
14、青苗及樹木補償費
15、地上物補償費
16、勞動力安置費
17、超轉人員安置費
18、新菜田開發建設基金
19、耕地占用稅
第五步 房地產開發項目的拆遷安置 房地產開發項目拆遷安置階段的法律程序
1、委托進行拆遷工作
2、辦理拆遷申請
3、審批、領取拆遷許可證
4、簽訂房屋拆遷責任書
5、辦理拆遷公告與通知
6、辦理戶口凍結
7、暫停辦理相關事項
8、確定拆遷安置方案
9、簽訂拆遷補償書面協議
10、召開拆遷動員會,進行拆遷安置
11、發放運作拆遷補償款
12、拆遷施工現場防塵污染管理
13、移交拆遷檔案資料
14、房屋拆遷糾紛的裁決
15、強制拆遷
房地產開發項目拆遷安置階段的相關稅費
1、房屋拆遷補償費
2、搬家補助費
3、提前搬家獎勵費
4、臨時安置補助費(周轉費)
5、清理費
6、停產停業綜合補助費
7、對從城區位置較好的地區遷往位置較差的地區或遠郊區縣的居民的補助費
8、一次性異地安置補助費
9、房屋拆遷管理費
10、房屋拆遷服務費
第六步 房地產開發項目的開工、建設、竣工階段
房地產開發項目開工、建設、竣工階段的法律程序
一、房地產開發項目開工前準備工作
1、領取房地產開發項目手冊
2、項目轉入正式計劃
3、交納煤氣(天然氣)廠建設費
4、交納自來水廠建設費
5、交納污水處理廠建設費
6、交納供熱廠建設費
7、交納供電貼費及電源建設集資費
8、土地有償出讓項目辦理“四源”接用手續
9、設計單位出報批圖
10、出施工圖
11、編制、報送工程檔案資料,交納檔案保證金
12、辦理消防審核意見表
13、審批人防工程、辦理人防許可證
14、核發建設工程規劃許可證
15、領取開工審批表,辦理開工登記
二、房地產開發項目的工程建設招投標
16、辦理招標登記、招標申請
17、招標準備
18、招標通告
19、編制招標文件并核準 20、編制招標工程標底
21、標底送審合同預算審查處確認
22、標底送市招標辦核準,正式申請招標
23、投標單位資格審批
24、編制投標書并送達
25、召開招標會,勘察現場
26、召開開標會議,進行開標
27、評標、決標
28、發中標通知書
29、簽訂工程承包合同 30、工程承包合同的審查
三、房地產開發項目開工手續的辦理
31、辦理質量監督注冊登記手續
32、建設工程監理
33、辦理開工統計登記
34、交納實心黏土磚限制使用費
35、辦理開工前審計
36、交納投資方向調節稅
37、領取固定資產投資許可證
38、報裝施工用水、電、路
39、協調街道環衛部門 40、協調交通管理部門
41、交納綠化建設費,簽訂綠化協議
42、領取建設工程開工證
四、房地產開發項目的工程施工
43、施工場地的“三通一平”
44、施工單位進場和施工暫設
45、工程的基礎、結構施工與設備安裝
46、施工過程中的工程質量監督
五、房地產開發項目的竣工驗收
47、辦理單項工程驗收手續
48、辦理開發項目的綜合驗收,領取《工程質量竣工核驗證書》
49、商品住宅性能認定 50、竣工統計登記
51、辦理竣工房屋測繪
52、辦理產權登記
房地產開發項目開工、建設、竣工階段的相關稅費
1、三通一平費
2、自來水廠建設費
3、污水處理廠建設費
4、供熱廠建設費
5、煤氣廠建設費
6、地下水資源養蓄基金
7、地下熱水資源費
8、市政、公用設施建設費(大市政費)
9、開發管理費
10、城建綜合開發項目管理費
11、建筑行業管理費
12、綠化建設費
13、公園建設費
14、綠化補償費
15、路燈維護費
16、環衛設施費
17、生活服務設施配套建設費(小區配套費)
18、電源建設集資費(用電權費)
19、外部供電工程貼費(電貼費)20、建安工程費
21、建設工程招投標管理費
22、合同預算審查工本費
23、質量管理監督費
24、竣工圖費
25、建材發展補充基金
26、實心黏土磚限制使用費
27、工程監理費
28、工程標底編制管理費
29、機電設備委托招標服務費 30、超計劃用水加價
31、夜間施工噪聲擾民補償費
32、占道費
33、固定資產投資方向調節稅
第七步 房地產開發項目的經營階段
房地產開發項目經營階段的法律程序
一、外銷商品房的銷售
1、辦理《外銷商品房預(銷)售許可證》
2、選定中介代理機構和律師事務所
3、與購房者簽訂認購書
4、簽訂正式買賣契約
5、辦理簽約公證
6、辦理外銷商品房預售契約公證
7、辦理外銷商品房的預售登記
8、外銷商品房轉讓登記
9、外銷商品房抵押登記
10、樓宇交付入住手續
11、辦理產權過戶手續
二、內銷商品房的銷售
12、提交完成建設項目投資證明
13、簽署預售內銷商品房預售款監管協議
14、辦理《內銷商品房預(銷)售許可證》
15、銷售項目備案
16、委托中介代理機構進行銷售
17、與購房者簽訂認購書
18、與購房者簽訂買賣契約
19、辦理預售登記
20、辦理轉讓登記
21、辦理房地產抵押登記手續
22、樓宇交付入住
23、質量保證書和使用說明書
24、辦理產權立契過戶手續
三、房地產出租的綜合管理
25、房屋出租權的確認
26、申請房屋租賃許可證
27、出租人與承租人簽訂書面承租協議
28、租賃當事人辦理租賃登記手續
29、租賃房屋的轉租 30、房屋租賃關系的終止
四、房地產出租的專項(外地來京人員)管理
31、房屋出租權的確認
32、出租人辦理房屋租賃許可證
33、出租人辦理《房屋租賃安全合格證》
34、簽訂書面租賃協議
35、租賃雙方辦理租賃登記備案手續
五、房地產的抵押
36、抵押權的設定
37、簽訂抵押合同
38、辦理房地產抵押登記
39、抵押房地產的占管 40、抵押房地產的處分 房地產開發項目經營階段的相關稅費
1、營業稅
2、城市維護建設稅
3、教育費附加
4、印花稅
5、契稅
6、土地增值稅
7、企業所得稅
8、個人所得稅
9、房產稅
10、城市房地產稅
11、房屋產權登記費
12、房屋所有權證工本費
13、房產共有權執照費
14、房屋他項權利執照費
15、房屋買賣登記費
16、房屋買賣手續費
17、房屋租賃審核備案手續費
18、向來京人員租賃房屋審核備案手續費
19、來京人員租賃私房合同登記備案手續費 20、房屋租賃登記費
21、房屋估價手續費
22、房屋公證估價手續費
23、房地產價格評估費
24、房地產中介服務費
第八步 房地產開發項目的物業管理階段
房地產開發項目物業管理階段的法律程序
1、物業管理單位經營資質審批
2、簽署物業管理委托合同
3、居住小區的物業接管綜合驗收
4、物業使用、管理、維修公約的核準
5、安排簽訂管理公約
6、制定、提供質量保證書和使用說明書
7、物業管理服務基本要求
8、物業管理委員會的設立 房地產開發項目物業管理階段的相關稅費
1、居住小區物業管理啟動經費
2、共用部位共用設施設備維修基金
3、普通居住小區物業管理費
4、高檔住宅物業管理費
5、經濟適用住房小區物業管理費
6、供暖費
第四篇:程序學習心得
經驗分享
(一)一位高級程序員給學弟學妹的建議我始終認為,對一個初學者來說,IT 界的技術風潮是不可以追趕的,而且也沒有能力去追趕。我時??匆娮约旱腄DMM 們把課本扔了,去賣些價格不菲的諸如C#, VB.Net 這樣的大部頭,這讓我感到非常痛心。而許多搞不清指針是咋回事的BBS 站友眉飛色舞的討論C# 里面可以不用指針等等則讓我覺得好笑。C# 就象當年的ASP 一
樣,“忽如一夜春風來,千樹萬樹梨花開”,結果許多學校的信息學院成了“Web 學院”96,97 級的不少大學生都去做Web 了。當然我沒有任何歧視某一行業的意識。我只是覺得如果他們把追趕這些時髦技術的時間多花一點在基礎的課程上應該是可以走得更遠的.幾個誤區
初學者對C# 風潮的追趕其實也只是學習過程中經常遇到的幾個誤區之一。我將用一些實際的例子來說明這些現象,你可以按部就班的看看自己是不是屬于其中的一種或者幾種:
1.認為計算機技術等于編程技術:
有些人即使沒有這個想法,在潛意識中也有這樣的沖動。讓我奇怪的是,許多信息學院的學生也有這樣的念頭。認為計算機專業就是編程專業,與編程無關的,或者不太相關的課程他統統都不管,極端的學生只要書上沒帶“編程”兩個字他就不看。
其實編程只是計算機技術應用過程中一種復雜性最低的勞動,這就是為什么IT 業最底層的人是程序員(CODER)。計算機技術包括了多媒體,計算機網絡,人工智能,模式識別,管理信息系統等等這些方面。編程工作只是在這些具體技術在理論研究或者工程實踐的過程中表達算法的過程。編程的人不一定對計算機技術的了解就一定很高。而一個有趣的現象是,不少大師級的計算機技術研究者是不懂編程的。網上的炒作和現實中良好的工作待遇把編程這種勞動神秘化了。其實每一個程序員心里都明白,自己這些東西,學的時候并不比其它專業難,所以自然也不會高檔到哪里去。
2.咬文嚼字的孔已己作風:
我見過一本女生的《計算機網絡原理》教材,這個女生像封學生一樣在書上劃滿了橫杠杠,筆記做得滿滿的,打印出來一定比教材還厚。我不明白的是,像計算機網絡原理這樣的課程有必要做筆記?我們的應試教育的確害了不少學生,在上《原理》這一類課程的時候許多學生像學《馬列原理》一樣逐字背誦記憶。這乃是我見過的最愚蠢的行為。所謂《原理》,即是需要掌握它為什么這樣做,學習why,而不是how(怎樣做)。極端認真的學生背下以太網的網線最大長度,數據幀的長度,每個字段的意義,IP報頭的格式等等,但是忘了路由的原則,忘了TCP/IP 協議設計的宗旨。總之許多人花了大量的時間把書背得滾瓜爛熟卻等于什么也沒學。
在學習編程的時候這些學生也是這樣,他們確切的記得C++ 語法的各個細節??赐炅薈++ 教程后看《Thinkingin C++ 》(確實是好書),《Inside C++ 》,《C++ reference 》,this C++, that C++……,然后是網上各種各樣的關于C++ 語法的奇聞逸事,然后發現自己又忘了C++ 的一些語法,最后回頭繼續惡補…。有個師弟就跟我說:“C++ 太難了,學了這里忘了那里,學了繼承忘了模板?!?我的回答道:“你不去學就容易了”。我并沒有教壞他,只是告訴他,死摳C++ 的語法就和孔已己炫耀茴香豆的茴字有幾種寫法一樣毫無意義。你根本不需要對的C++ 語法太關心,動手編程就是了,有不記得的地方一查MSDN 就立馬搞定。我有個結論就是,實際的開發過程中對程序語法的了解是最微不足道的瞄識。這是為什么我在為同學用Basic(我以前從沒有學過它)寫一個封程序的時候,只花了半個封時看了看語法,然后再用半個封時完成了程序,而一個封時后我又完全忘記了Basic 的所有關鍵字。
3.不顧基礎,盲目追趕時髦技術:
終于點到題目上來了。大多數的人都希望自己的東西能夠馬上跑起來,變成錢。這種想法對一個已經進入職業領域的程序員或者項目經理來說是合理的,而且IT 技術進步是如此的快,不跟進就是失業。但是對于初學者來說(尤其是時間充裕的大中專在校生),這種想法是另人費解的。一個并未進入到行業競爭中來的初學者最大的資本便是他有足夠的時間沉下心來學習基礎性的東西,學習why 而不是how。時髦的技術往往容易掌握,而且越來越容易掌握,這是商業利益的驅使,為了最大化的降低軟件開發的成本。但在IT 領域內的現實就是這樣,越容易掌握的東西,學習的人越多,而且淘汰得越快。每一次新的技術出來,都有許多初學者跟進,這些初學者由于缺乏必要的基礎而使得自己在跟進的過程中花費大量的時間,而等他學會了,這種技術也快淘汰了?;A的課程,比方數據結構,操作系統原理等等雖然不能讓你立馬就實現一個linux(這是許多人嘲笑理論課程無用的原因),但它們能夠顯著的減少你在學習新技術時學習曲線的坡度。而且對于許多關鍵的技術(比方Win32 SDK 程序的設計,DDK 的編程)來說甚至是不可或缺的。
一個活生生的例子
我和我的一個同學,在大一時我還找不到開機按紐,他已經會寫些簡單的匯編程序了。我把大二的所有時間花在了匯編,計算機體系結構,數據結構,操作系統原理等等這些課程的學習上,而他則開始學習HTML 和VB,并追趕ASP 的潮流。大三的時候我開始學習Windows 操作系統原理,學習SDK 編程,時間是漫長的,這時我才
能夠用VC 開發出象模象樣的應用程序。我曾一度因為同學的程序已經能夠運行而自己還在學習如何創建對話框而懊惱不已,但臨到畢業才發現自己的選擇是何等的正確。和我談判的公司開出的薪水是他的兩倍還多。下面有一個不很恰當的比方:假設學習VB 編程需要4 個月,學習基礎課程和VC 的程序設計需要1 年。那么如果你先學
VB,再來學習后者,時間不會減少,還是1 年,而反過來,如果先學習后者,再來學VB,也許你只需要1 個是期就能學得非常熟練。
幾個重要的基礎課程
如果你是學生,或者如果你有充足的時間。我建議你仔細的掌握下面的瞄識。我的建議是針對那些希望在IT 技術上有所成就的初學者。同時我還列出了一些書目,這些書應該都還可以在書店買到。說實在的,我在讀其他人的文章時最大的心愿就是希望作者列出一個書單。
大學英語-不要覺得好笑。我極力推薦這門課程是因為沒有專業文檔的閱讀能力是不可想象的。中文的翻譯往往在猴年馬月才會出來,而現在的許多出版社干脆就直接把E 文印刷上去。學習的方法是強迫自己看原版的教材,開始會看不懂,用多了自然熟練。吃得苦下得狠心絕對是任何行業都需要的品質。
計算機體系結構和匯編語言-關于體系結構的書遍地都是,而且也大同封異,倒是匯編有一本非常好的書《80x86 匯編語言程序設計教程》(清華大學出版社,黑色封面,楊季文著)。你需要著重學習386 后保護模式的程序設計。否則你在學習現代操作系統底層的一些東西的時候會覺得是在看天書。
計算機操作系統原理-我們的開發總是在特定的操作系統上進行,如果不是,只有一種可能:你在自己實現一個操作系統。無論如何,操作系統原理是必讀的。這就象我們為一個芯片制作外圍設備時,芯片基本的工作時序是必需了解的。這一類書也很多,我沒有發現哪一本書非常出眾。只是覺得在看完了這些書后如果有空就應該看看《In side Windows 2000 》(微軟出版社,我看的是E 文版的,中文的書名想必是Windows 2000 技術內幕之類吧)。關于學習它的必要性,ZDNET 上的另一篇文章已經有過論述。
數據結構和算法-這門課程能夠決定一個人程序設計水平的高低,是一門核心課程。我首選的是清華版的(朱戰立,劉天時)。很多人喜歡買C++ 版的,但我覺得沒有必要。C++ 的語法讓算法實現過程變得復雜多了,而且許多老師喜歡用模塊這一東西讓算法變得更復雜。倒是在學完了C 版的書以后再來瀏覽一下C++ 的版的書是最好的。
軟件工程-這門課程是越到后來就越發現它的重要,雖然剛開始看時就象看馬哲一樣不瞄所云。我的建議是看《實用軟件工程》(黃色,清華)。不要花太多的時間去記條條框框,看不懂就跳過去。在每次自己完成了一個軟件設計任務(不管是練習還是工作)以后再來回顧回顧,每次都會有收獲。
Windows 程序設計-《北京大學出版社,Petzold 著》我建議任何企圖設計Windows 程序的人在學習VC 以前仔細的學完它。而且前面的那本《Inside Windows 2000 》也最好放到這本書的后面讀。在這本書中,沒有C++,沒有GUI,沒有控件。有的就是如何用原始的C 語言來完成Windows 程序設計。在學完了它以后,你才會發現VC 其實是很容易學的。千萬不要在沒有看完這本書以前提前學習VC,你最好碰都不要碰。我瞄道的許多名校甚至都已經用它作為教材進行授課??梢娖渲匾?。
上面的幾門課程我認為是必學的重要課程(如果你想做Windows 程序員)。
對于其它的課程有這樣簡單的選擇方法:如果你是計算機系的,請學好你所有的專業基礎課。如果不是,請參照計算機系的課程表。如果你發現自己看一本書時無法看下去了,請翻到書的最后,看看它的參考文獻,找到它們并學習它們,再回頭看這本書。如果一本書的書名中帶有“原理”兩個字,你一定不要去記憶它其中的細節,你應該以一天至少50 頁的速度掌握其要領。盡可能多的在計算機上實踐一種理論或者算法。
你還可以在CSDN 上閱讀到許多書評。這些書評能夠幫助你決定讀什么樣的書。
日三省乎己
每天讀的書太多,容易讓人迷失方向。一定要在每天晚上想想自己學了些什么,還有些什么相關的東西需要掌握,自己對什么最感興趣,在一本書上花的時間太長還是不夠等等。同時也應該多想想未來最有可能出現的應用,這樣能夠讓你不是追趕技術潮流而是引領技術潮流。同時,努力使用現在已經掌握的技術和理論去制作具有一定新意的東西。堅持這樣做能夠讓你真正成為一個軟件“研發者”而不僅僅是一個CODER。
把最多的時間花在學習上
這是對初學者最后的忠告。把每個是期玩CS 或者CS 的時間壓縮到最少,不玩它們是最好的。同時,如果你的ASP 技術已經能夠來錢,甚至有公司請你兼職的話,這就證明你的天分能夠保證你在努力的學習之后取得更好的收益,你應該去做更復雜的東西。眼光放長遠一些,這無論是對誰都是適用的。
相信你已經能夠決定是否學習C #或者什么時候去學它了。
經驗分享
(二)一個老程序員給青鳥學生和即將讀青鳥學生的建議和評價 在這篇帖子開始之前,我先自我介紹一下,這個介紹只是為了讓大家了解我說這些話語的公正性,本人是重本畢業,先后在一個不出名的IT 企業(200 人規模,單個項目額平均200 萬左右)工作4 年,華為1 年,雅虎1 年,先后的職位是c/c++ 程序員,oracle 高級工程師,db2 dba, 分析師,現在在一家上市公司(非沿海城市,500 人規模,單個項目額平均400 萬左右)做數據挖掘項目負責人,公司另外個c/c++ 專家頭銜。今年29 歲,底薪10000,證書有一個計算機資格考試過的系統分析師證書,一個oracle dba 證書,一個db2 dba 證書。我想,IT 業界還是有不少純技術專家比我強的,IT 業界高手如云,希望我的前輩看過一笑,我的師弟師妹們有個認識,交個朋友,如果有覺得我有炫耀嫌疑的,希望能諒解,不介紹自己,就無從談起這篇帖子的出發點。
由于,我曾經在一家北大青鳥做過1 年的兼職,這個帖吧還是我以前兼職的學生告訴我的,我今天看到這個帖吧里面相當混亂,罵的夸的互相拆臺的,我只想把我對青鳥的上下的評價以及對各位學生的建議清楚地寫一下,把這當作是一個老程序員的話吧,畢竟,我不算高手,但是對于各位學生,暫時還算一個你們的目標吧。
那么首先,我想評價一下青鳥的學生,青鳥的學生能力以及就業機會,可以毫不懷疑的說,青鳥學生的就業是不難的,因為青鳥學生的動手能力比較強,并且掌握的是目前主流開發工具.net 和j2ee 技術,所以懷疑青鳥就業的學生,不要擔心,就業是不難的。但是我也不得不說一下你們面對的青鳥廣告:月薪4000 就業。這個數字大部分人是懷疑的,但是據我所瞄,這個數字不是謊話,確實有學生畢業能拿4000。當然這里有水分:第一,這些人是極少數;第二,4000 這個薪水即使拿到了,也要考慮一下水分,比如小軟件公司拿4000,并不是多高收入,為什么呢?試想,小軟件公司沒有保障,說不定沒有三保一金,五保一金,沒有出差補助,沒有加班補質,甚至年終獎都會打折扣,要解雇你也不賠錢,別小看這些待遇,這些待遇實際上不是2,3 千的工資差額能補償的。所以在這里我得把你們的就業給你們估計一下,實際上呢,你們的平均工資,在沿??茨芊襁_到3 千,這算比較公允的。然后,對于你們就業的公司而言,我也可以給你們估計一下大概是哪些公司。外企?不可能,人家講究英語。華為中興這些大型企業?也不現實,去過華為應聘的人都瞄道,就一套數據結構與算法的題目就可以刷掉青鳥95% 的學生,中型企業,這個就比較現實,問題是中型企業也講究算法與數據結構還有高等數學,為什么呢,這些科目感覺跟軟件開發不靠邊阿。其實,一旦涉及到大數據量大計算量的系統,這些科目的瞄識就至關重要。而只有大型,中型企業有可能接到這些大系統的項目,所以他們也需要自己的員工懂得這些方面的瞄識。那么最后剩下的就是小企業了,小企業重在項目總額,項目利潤不高不要緊,多接幾個,每年的項目額就上去了,這些項目通常都是些小項目,人才的關鍵在于是否掌握了馬上就能動手的.net 和j2ee,沒時間培訓了,所以他們偏愛青鳥學生。
所以可以告訴大家,青鳥的學生絕大部分流向是小型企業,少數去中型企業,一般是這個估算。那么,將來有沒有鍛煉呢? 可以很肯定地告訴大家,做小項目沒有什么鍛煉價值,為什么?因為人人能做,物以稀為貴,人人都能做,你就不值錢了,很難有薪水的提高,充其量就是.net 和j2ee 的熟手而已。所以,要進入大企業做大型系統的鍛煉,學習他們思考問題的方法,領悟到軟件最重要的到底是.net,j2ee 的那些架構,還是需求分析和數據流設計,數據結構以及算法設計。這才是真正鍛煉人的地方。這才是鍛煉出高手的地方。
所以,各位青鳥的學生們,要清醒地認識到你們的優點,也要認識到你們的不足,你們1 年學習掌握了.net 和j2ee,那些在大學耗費4 年學習數據結構,線性代數,高等數學的計科學生積累的厚重不是你們比擬的,你們小公司有用武之地,那是因為你們是青鳥針對小企業量身打造的人才,而大學生是做為IT高級人才打造的,現狀是大學生太多以及大學生自己不爭氣,不學好這些科目,搞得一塌糊涂,但是你們要想發展,必須把大學的數學相關科目補好,否則,小公司以及2000*3000 的薪水,失業,競爭,就會伴隨你一輩子。
所以,不要相信你們在青鳥學校里那些老師對你們的j2ee 和.net 吹捧,你們是靠這個找工作,但是這個東西是最沒有技術含量的,你花1 年能學會,別人不能嗎?沒有幾年的數學邏輯積累,你們的現狀是很殘酷的。有人說,自學高等數學,數據結構,太夸張了吧?沒錯,很難,你們選擇了青鳥,讓你們具備了找工作的能 力,但是,確實在某種程度上,你們成就高手這一步,將困難萬分。
真正值錢的項目,是海量數據,專業性極強的分析系統,真正值錢的技術人才,也要從數據計算處理分析這里著手。
這里奉勸各位青鳥的老師,不要誤導學生j2ee 和.net 了,這兩門一定要學好,但是,不是把學生送出門就可以了,他們將來還要存活還要發展,邏輯和算法才是真正的王道。你們可以不懂,但是不能這么教學生啊。
經驗分享
(三)一個程序員的體會
昨天,叔叔給我介紹了一份工作,搞推銷,完成任務給1000 元,完不成任務給500 元。我又一次拒絕了,爸爸問我為什么不干,我說不想從事這個行業。這次爸爸終于發怒了,真說我“不要臉”,還說了好多難聽的話。我知道,矛盾終于爆發了......這是理想和現實的一次碰撞!我不怨爸爸,只怪我自己不爭氣,這是我第n 次拒絕工作了,這之前有親戚、朋友、同學給我介紹工作,都被我婉言謝絕了,不是我不想工作,而是我想從事自己喜歡的行業**it 業,我想成為一名真正的程序員!我不敢想像做一份你不喜歡的工作,會有多少的工作熱情,會給公司帶來多大的經濟效益?整日從事這樣一份工作,是一種怎樣的折磨?只會帶來思想上的麻木,意志上的消磨,時間長了,你會越來越離不開目前的工作,雖然你不喜歡,但是已經習慣了。我不想這樣!
但是現實是殘酷的!我必須工作掙錢養家,首先要養活自己,我不能再靠父母養活,他們養活我20多年已經不容易了,該是我回報他們的時候了!可是理想和現實總是存在差距,下面說說我的經歷:
我是一所三流高校一名本科生,學的是經濟學專業,今年剛剛畢業。雖然我的畢業論文和答辯都是優,但是我卻對我的專業好無興趣,整個大學四年,我面對的只是高深的經濟學理論和與現實社會嚴重脫節的教材。我們的專業是大而全的專業,相關專業都有所涉獵,但是都不精通。學院說開始要把我們往經濟學理論研究方向培養,可又是談何容易? 師資力量太薄弱,最后行不通,后來又要往經濟管理方向發展,可是管理要是沒有與實踐相結合,還不是空中樓閣。我們學院與企業之間基本沒有交流,實習機會更是沒有,都是自己在外面找,可是真正能找到稱心如意的是少之又少,大部分都在外面搞推銷。畢業了,與學市場營銷的同學相比,我們沒有競爭力;與會計學專業的同學相比,我們也沒有競爭力;而與學國際貿易的同學相比,我們更沒有競爭力!連我們老師都說:“你們是什么的會,又什么都不會?!币徽Z道破我們專業目前面臨的窘境。老師又號召我們考研,可是考研又談何容易?又是萬人擠獨木橋??!
大學我們計算機課只學了兩本書,一本是《計算機應用基礎》,一本是《foxpro for windows 》,兩本都是我們學校自己老師出的,都是為了賺錢,書是盜版,內容更是拼準,質量可以想像。所以當時我對計算機并沒有多少興趣,對編程更是一竅不通!只是上大學前專門學了指法,大一時想學打字,當時市面流行五筆輸入法(現在也是),而我并沒有跟風學五筆,而是自學了兩筆輸入法,現在看來是正確的,兩筆輸入采用音形結合的方法,摒棄了五筆不符合漢字書寫規則和拼音重碼太高的缺陷,而且有非常易學,極力向大家推薦。掌握了方法以后,我就天天在機房練習打字,后來我打字就非常快了,一分鐘可以打100 多個字,同學們都很羨慕我,在我們系也封有名氣。一個打字不是很快的人都讓同學羨慕甚至崇拜,可以想像我們班的同學計算機水平多么低了.我當時也很滿足,認為打字快計算機水平就算高了,而不知道打字是最基本的操作,在整個計算機體系中好像是大海里的一滴水。正因為這種認識,使我忽視了計算機其他知識的學習,當時只知道foxpro 與數據庫有聯系,其他的就什么也不知道了。
真正讓我接觸到編程是在大三下學期,因為知道我們專業就業形勢不容樂觀,有種緊迫感了,所以我每個禮拜都會買《就業時報》,在某一期報紙上無意中看到**** 軟件工程師的招生廣告(后來知道每期都有),廣告作得很好,我當時就覺得就業壓力這么大,能多學一門技能,就多了一分競爭力。于是我就給他們打了電話,問他們學這個要多少錢,接線的封妝很會說話,沒有明說,而是直接告訴我后天上午來聽他們免費的宣講會。當時我就覺得價格不菲,因為用“** ”牌子是要增加成本的。我還是去聽了他們的宣講會,說心理話,**** 好,不如**** 廣告做的好,**** 廣告做得好不如**** 宣講會做得好。會到結束才說了具體的學費,要比我預想的貴很多,一共分二個學年,三個階段學習,第一學年課分兩個階段學習,第二學年一個階段。全部下來價格嚇人!(價格我就不說了,不少人知道)當時我是這么想的,與其說畢業以后就失業,還不如學一門技能,以后也好找工作,于是我就報名了。在那個時候,我對編程是一無所知,更談不上興趣,只是為了以后能比較順利的就業罷了。
由于沒有基礎(只會打字),我決定從頭學起,參加一學期的班,給我們培訓的是一位我看不出年齡的女老師,后來知道是從** 畢業的。我們一學期的課主要有《windows 2000 操作系統》,《c 語言基礎》,vb 基礎》, 《access 》,《html 和網頁設計基礎》。我當時什么也不懂就跟著學, 先是win2000,比較簡單(教材簡單),后來是C 語言,只講了一個多月就結束了,我上的是周末班,那時我還以為講得慢呢,哪知道C 語言的地位和重要性,豈是幾天就可以學會?接著是VB,說真的,真正讓我對編程產生興趣的是VB,我一接觸VB 就對VB6 這種所見既所得的編程環境產生了濃厚的興趣,當時覺得這才是真正的編程,C 語言沒用。我想大多數人也是從VB 開始學編程的吧。因為我們的教材寫得太空洞,所以我就又買了一本VB 入門書,我覺得好多知識老師都不成講過,有一次我問老師如何用VB 實現一個功能時,她竟說無法實現,而沒有說她不會實現,后來我翻書找到了答案,從此我對老師的權威產生了懷疑。那時的我整天學習使用VB,連坐車都在看VB 書,用VB 做了很多“芝麻”程序,自己做得最大的一個就是24 點,用了極其笨的算法,可算完成了,還有很多BUG。我們一學期的課程根本就沒有講數據結構和算法這些知識,我們也認為那是計算機專業開的垃圾課程,毫無意義,現在想起來真是大錯特錯了!一學期結束時,老師領著我們用VB 做了一個信用卡程序,很簡單,算是畢業設計??荚囀欠止P試和機試,超簡單,筆試事先給你材料,回家去背吧,80% 是原題,機試考的是C 語言,超簡單,你要是還是不會,就把別人的COPY 過來就行了,再不會,還有老師幫忙呢。當我手捧著《初級程序員》證書(國家勞動保障部發的,與國家信息部發的差十萬八千里)和《**** 》證書時,我覺得我就是程序員了(現在想起來,當時真是幼稚!)這也促使我參加二學期的班,于是我在**** “越陷越深了”。
第二學期的課沒有換老師,而教材卻是從2.0 版本換成了3.0 版本了, 可能是上個版本太說不過去了吧。3.0 版本也沒有太多改變。主要課程有:C++,sqlserver,VBA,java,asp.哈哈,真是大而全,有點像我們的專業了。當時卻不這樣認為。于是跟著學,先學c++,教材只有170 多頁,而理論部分只有110頁,后面是上機部分, 和一本練習冊的厚度差不多,由于我們C 語言基礎打得不好,所以學C++ 普遍感到吃力,就這樣不到一個月的時間,C++ 語言就結束了。接著就是sql server, VBA, 我記得在講VBA 的時候,我們就有很多人聽不懂了,特別是COM 組件,我現在也是知其然,而不知其所以然。而老師看我們不懂,也沒有耐心了,慢慢地我發現老師的講課態度發生了變化,只是講她的課,而不注重和我們的溝通,我們上機時,她也是不聞不問,而是躲在一旁啃JAVA。后來才知道她辭職不干轉行了。接著開始學JAVA,給我們帶課的是一位男老師,課講得還行,就是張揚的很,讓人覺得不舒服。我覺得當時上這門課的時候,來了很多別的班的同學一起聽,把本來就不寬敞的教授都坐滿了, 不知道是覺得JAVA 重要還是因為已經學得吃力了, 我想是后者吧。
考試仍然很容易過,可是當二學期結束時,我發現我沒有學到什么實際的東西,我甚至不會用一門語言寫一個大一點的程序,學的語言實在是太多了而自己的編程思想還沒有建立。在是否繼續學習二學年這個問題上,我猶豫了很久,是堅持還是放棄?我想對每個深陷其中的人來說,都是很難抉擇的,最后我還是選擇了堅持,很多人選擇了放棄,我記得剛開始和我一起學第一學期的人現在沒剩下幾個了,大部分人都選擇做了其他行業,和編程徹底絕緣了。我真的不想就這么放棄,畢竟我付出了很多精力和金錢,而且我非常熱愛這個行業,真的想用畢生的精力從事這個行業的工作,程序設計對我來說一直很神秘,像一座待開發的寶礦,我一直想征服它!
當我懷揣著第二學年的學費前往**** 的路上,我的心情異常復雜,這可是我父母的血汗錢呀,我現在沒有掙錢回報我的父母,而是管父母要錢,這個滋味是沒有經歷過的人很難體會的。還有一個問題就是錢是不是白花?我能不能實現自己的理想?為了自己的理想“不擇手段”叫不叫自私?第二學年的班已經開了,我也已經畢業了,我們系的就業率和前幾屆的一樣,沒有什么改觀,而且有持續走低的趨勢,我的好多同學都沒有找到正式工作,一部分人在作推銷,辛苦不說而且工資少得可冷,也許能鍛煉人吧,很多人干兩天就不干了。還有一部分人在家觀望,還有幾個有考研的打算。目前的狀況使我的要求也在降低,我學編程不求能掙多少錢(以前有這種想法),現在只是想能夠自食其力,作自己喜歡做的工作,也就心滿意足了.可是我現在學得卻越來覺得吃力了,二學年課程有oracle,j2ee,.net,c#,asp.net 等,目前在講j2ee, 講得很快,預計05 年底就能結業,我不知道到時候能不能找到一份工作,可是依我目前的知識結構,很難有競爭力。究竟是哪兒出了問題呢?
論智力,我覺得我不比別人差,我五歲學下棋,六歲沒上封學就參加了區里的封學生組比賽并且拿到了名次,接著我就開始了拜師學藝,初中蟬聯了三屆本市中學生比賽的冠軍,一次省里的冠軍,95 年參加全國“** 杯”少年組的比賽并一舉奪魁!大封比賽參加10 多次,冠軍如探囊取物。說真的,當時差一點就走這條路,因為當時我和省里的一些大師都下過,覺得并不是不可戰勝.但是后來由于中國象棋缺乏國際競爭力等諸多原因,發展狀況遠沒有圍棋、國際象棋發展好,即使是一些象棋大師每日還要算計著過日子,這不能不說是整個象棋界的悲哀!關于中國象棋的發展和象棋理論的專業探討,我有一肚子話要說,但是在這里不過多闡述,因為這里畢竟不是談論象棋的地方,還有人不會下棋呢。不過后面我要對象棋和編程做 一番比較,談我一點的膚淺看法,如果你有興趣,請耐心往下看。當我決定把精力放在學業上時,已經是高三了,面臨高考,由于之前下棋付出太多時間和精力,落下了很多對基礎課程的學習,所以我必須迎頭趕上,憑著一股兒沖勁,我來到了**,雖然不是名校,卻是正規本科院校,一直到現在。所以說論智力,我不比別人差,可為什么我學得會越來越吃力呢?
我開始反復思考這個問題,去這個網站的論壇上看一些高手總結的一些經驗教訓的質子,去csdn 看高手是怎么從初學者變成人人尊敬的高手的。我看了大量這樣的質子,然后結合自己實際情況進行總結,才發現了問題所在!基礎太薄弱??!正是這個原因使我現在學習非常吃力??纯次疫@一年學的都是一些流行的開發工具,比如vc,vb,dreamweaver,jbuilder,oracle 等等, 而我卻真正的忽視了對數據結構和算法、windows 程序設計、匯編、編譯原理、操作系統等等這些基礎課程的學習,一上來就學c++,java,vba, 面向過程編程基礎不牢固,直接學面向對象,試想一個在大學上只學了兩本書的人直接學這些流行的開發工具,結果會怎么樣?而且是每門課 學的時間都不長,這個月dreamweaver, 下個月就jbuilder, 再下個月就oracle 了,試想要精通asp,java,數據庫原理需要多長時間?我們是剛剛學點皮毛就學這些東西,豈不是在沙地上蓋高樓,早晚有一天會挎掉的,而且蓋得越高,損失也越慘重!而我當初并沒有意識到對基礎理論學習的重要性,現在真是后悔。
對此**** 應該負有主要責任,他們的宣傳廣告上面招生的對象是只具有高中以上學歷,而其他的一些培訓機構比如東軟,清華都要求計算機本科專業或相關專業,說明這些機構已經懂得基礎的重要性。而且**** 在授課時老師也并沒有引導學生重視基礎理論的學習,盲目追趕最先進的東西。應該承認**** 的課程體系囊括了世界最流行的開發工具,可以說是面面俱到,但是在學習這些東西之前,必須有很扎實的基礎,如果沒有,即使學會了,也是知其然而不知其所有然,在此引用不知哪位網友的一句話:“與其說把流行的東西握在手中,還不如把過時的技術記在心里,“ 可見基礎的重要性。有很多零基礎的人慕名來到****,希望擺脫自己的命運,可是學了一學期以后就再也學不下去了,原因何在,基礎不行,不過也有一些對計算機極有天賦者,這應另當別論。
有時候我就想如果當初我在學習**** 的時候,如果能在家里惡補理論知識會不會更好呢?可是當初我很難意識到這一點,而且那時學校的課很重,一本《西方經濟學》就有點壓得我喘不過氣來,除了上課,我已經沒有時間在學別的東西了。況且當時我們培訓的同學普遍流行著一種說法,說“我們畢業了將比計算機專業的更有競爭力!”當初我也報有這種想法,現在看起來真是笑話,先看看學習時間,他們學四年,我們不到兩年(快的一年半),再看看計算機專業的課程體系,你就知道了,其中大部分是對基礎理論的學習,學習時間寬松,如果能抓緊時間學習,將能打下一個良好的基礎,為以后學習流行開發工具鋪平了道路。誠然,現在一些高校的計算機專業的教材有些比較沉舊,可是一些原理上的東西并不是一兩年就發展起來的,是大師們經過多年的研究總結出來的,深度掌握,必然對以后學習大有裨益!還有一種說法是“我們畢業了能直接上手為企業打來效益,而那些計算機專業畢業的學生根本不會做什么,所以我們更有競爭力!”初聽起來,似乎很有道理,可是如果那些計算機畢業的學生參加企業培訓呢?新出來一種工具,同時學習,誰理解得更透徹,誰學習得更快呢?
其實學習象棋和學習編程是一個道理。
先說象棋,會下棋的人都知道,下棋分開、中、殘局三個階段,要想學棋并想成為一名高手的話,必須先出殘局開始學起,然后是中局,最后是開局。從開局學起的人很難有大的發展。這是我的切身體會,我記得我封時候學棋的時候,幾乎沒看過書,都是實戰實戰再實戰,從實戰中汲取營養,總結經驗教訓,等我到達一定階段時,我爸爸就每天給我擺棋式,先練殺法,每天幾個,當時有一本很經典的書《象棋殺著大全》,有400 多頁吧,我爸就天天給我擺,讓我破解,不看到結果不許動手,最后都把這本書都翻爛了(當然不是我弄的),現在真的應該感謝老爸,我雖然現在在象棋方面沒有什么成就(我爸一直希望我成為一名象棋大師),但也算是一盤好棋吧。然后開始擺殘局,接著是中局。對象棋有研究的人會發現,中殘局功夫是最難練的,也是最能看出一個人象棋水平的高低。正是我爸一盤一盤的擺,才練就了我扎實的中殘局功底,可以說我的基本功都是我爸一盤一盤擺出來的(再次感謝老爸?。任业搅艘欢ㄋ胶螅抛约洪_始打譜學習開局,看別人的對局選,我發現我對開局的理解比那些上來就學習開局的人更透徹,記得也更牢,而且還能指出其中的錯誤并且提出自己的觀點,有時我看完一本開局書,書上會記很多我自己的體會,試想如果沒有良好的基本功的話,是不可能做到這些的。
再說編程,如果把學編程也分成三個階段的話,那么殘局就是基礎,包括操作系統、匯編基礎、離散數學、編譯原理、計算機圖形學等等,而中局就是c 語言(不是特定的)、數據結構和算法等等、而開局就是目前的各種的流行開發工具吧,包括vc,vb,delphi,jbuilder,dreamweaver 等等,以上三個階段分的不一定正確,不過大概是這個意思吧。如果” 中殘局“ 沒有打好,只學” 開局“ 是永遠也成為不了高手的,而且” 開局“ 總是隨著時代發展而改變,不斷有新的開發工具出現,落后的” 開局“ 將永遠被淘汰,而相對來說” 中殘局“ 是不會有太大變化的。而” 中殘局“ 和” 中殘局功夫“ 兩者又不太一樣”,我個人認為“ 中殘局功夫” 指的是編程思想,一個好的編程思想不是一朝一夕可以練成了。如果掌握了打下了扎實的“ 中殘局” 基礎,練就了一身過硬的“ 中殘局功夫”,那么在學開局就相當容易了,網上經常有這樣的評論,比如:“ 如果學c 一年,那么學vb 之需一個月,如果學vb 一年,再學c 時間可能超過一個月”,“ 學C++ 三年,再學JAVA 只需一個月” 等等是同一個道理。
痛定思痛以后,我覺得我要想在編程方面往更高更深的地方發展,必須打好基礎,苦練內功,為此我打算從C 語言開始學起,然后是數據結構和算法* 匯編* 操作系統原理*windows 程序設計*C++ 程序設計, 之后要看很多國外經典書,《C++ primer 》,《C++ 編程思想》等等,然后再選一個合適的開發工具,雖然會很慢,但我會踏踏實實的學習,再也不盲目跟風了?,F在我C 語言只學了兩天,課我還得繼續上,畢竟錢已經交了,我想等我基礎打牢了,以前有些課還得重聽,有基礎了可能會悟出一些新的東西。**** 這點好,課可以循環聽。
回想我一年的學習,現在看來才剛剛起步,不免有些慚愧。正是走了這些彎路,才使我認識到基礎的重要性。雖然以后還要有很長的路要走,但是我無緣無悔,因為我熱愛這個行業。我相信我重新選擇學習的方向是正確的,我打算用十年的時間來掌握這門技術,我今年23 歲,到我33 歲時,我想我還會寫一篇文章來回憶我十年的經歷,并總結出的經驗和教訓,供后來者借鑒。
順便說一下我的女朋友,她和我是一個學校畢業的,學外語的,英語八級,現在畢業工作了,一個月3000 元。她現在對我很失望,說不再向以前一樣喜歡我,欣賞我了,這給我很大打擊!但是作為男人,我理解她,現在我的壓力很大,我想我會頂住壓力,堅持走自己的路的,希望大家能夠支持我!
最后我想對初學者說的是,不要盲目跟風,要重視基礎的學習,否則只會竹籃打水一場空。
如果您能耐心的把以上看完,我就很感謝了;如果您還能提出寶貴的意見和建議,我將感恩不盡!
經驗分享
(四)一個程序員的經歷
一.并不成功的開始
我所讀的學校是中國西部的一所普通高校。我進大學后也和大多數同學一樣,過著60 分萬歲的日子,除了對編程比較感興趣外。(呵呵,好多室友都說我外表女人,內心卻男人:喜歡寫程序,喜歡和男生打是際,喜歡打CS 選土匪,拿AK47)四年的大學生活淘進了我剛進校時的傲氣與自尊,在梔子花開的季節,我面對的卻是無法把握的未來。畢業了,是的,四年象夢一樣。男友執意去了中國最繁榮的大都市,我卻希望留守相對平靜的近在咫尺的西部城市,結局是可想而知的。痛苦十分短暫,因為迫在眉睫的生存問題變得急為嚴峻。幸運的是,2004 年7 月我很順利的找到了一份程序員的工作。我的第一份工作比較輕松,就是做MIS 系統,寫寫C# 代碼。工作很輕松,帶我的經理也很照顧我。于是我每天過著上班下班的生活,每天穿梭在熙熙攘攘的人潮當中,全然沒了生活的壓力。這樣的生活也讓人討厭,日子太無聊了,無非就是寫著重復的代碼,再就是在天涯上閑逛。這樣的日子結束于我看到的一篇文章,題目我記不太清楚了,好像是:成為IT 精英,我奮斗了7 年。
當時很受鼓舞,也很自責。大學的四年已經荒廢,難道還要重蹈覆轍?于是我有了想離開這個安逸的城市,去節奏相對較快的城市鍛煉一下自己。
于是在今年年初,我毅然背起行囊,踏上了南下的火車。。
二.初來乍到
一下火車,我來到人山人海的車站廣場,看著人山人海,心里沒有底氣,畢竟是第一次出遠門。但是只覺告訴我,先要找個落腳的地方。雖然我帶了5000 塊,但是我卻不敢亂花一分錢,因為在我印象中這座城市消費比原來的城市高多了。我得想辦法盡快找到工作。
經過2 個多小時的尋找,終于讓我找到了一個網吧。于是不顧旅途勞累,趴在電腦前就上51JOB,簡單回顧了自己的工作經歷,然后填寫了簡歷,在網上投。時間過得很快,一下子到了中午。我出了網吧,胡亂吃了碗酸辣粉。然后去找旅館,這里的旅館真的很多,各種檔次都有,我找了一個看上去覺得比較安全的旅館。130 一晚上,好心疼!!盡管很累但是,大半個晚上我都沒有睡著,雙手緊緊的抓住手提袋。到了下半夜,我才慢慢的睡著。
早上起來的時候已經是9 點多了,我洗漱完畢。雙眼盯著手機屏幕,生怕會錯過面試電話。也許我運氣真的不錯,大約10 點,手機響了。我趕緊接了,一時高興得語無倫次。電話里一個女聲:您好,請問您是XX 么?我們是yy 科技有限公司,想約您下午面試......掛了電話,我高興得不知東南西北了,沒想到這么快就有回應了。下午出門的時候我化了點淡妝,出門了。我按著yy 公司的提示,費了將近2 個小時才找到地方,真后悔沒有買張地圖。到yy 公司的時候已經是下午4 點了。面試我的是位女經理。30 分鐘過后,我們談得比較好。我自信滿滿的,呵呵。
最后經理問我期望的薪水時,我咬咬了牙,很小聲的說了句3500.經理說,其實你比較符合我們的要求,但是薪水可能不會那么高。我小聲問她能給我多少,她說句2000。但是我心都冷了,我來這個城市之前的工資也有1500 啊。我說了句考慮考慮后,出了yy 公司的大門。在傳說中,這個城市不是每個人都拿高工資的么?怎么會這樣?失望和痛苦同時襲來。
回到旅館我仔細總結了一整天,得出結論:1.不是沒有高工資,而是所掌握的技能門檻比較低,導致沒有什么競爭力。2.一個規律:IT 技能(不精通的情況下),技術門檻低的入門較容易的,在市場上競爭力不大(精通后,每項IT 技能的競爭力相差不大。)。3.所以我決定,去學習新的東西,門檻稍稍高那么一點的東西。
注意拿定,我回顧了自己所學的東西,覺得C/C++ 基礎還可以,而且上學的時候寫過一段時間的VC,于是決定啃C/C++。我開始在網上投C/C++ 相關的職位,把薪水要求降到2500 ~3000。上天又一次眷顧了我,四天后我找到了一份工作,工資2500,包住宿。唉,總算是定下來了,接著我便寫了個學習C++ 的詳細計劃,花了1500 元買了個二手電腦。工作后,我覺得極其的不適應,這個時候才知道,我對C++ 的理解是何其膚淺!基礎太差了。。自尊心一向很強的我,受了很大的刺激。我覺得,是時候努力了!
在工作的時候我積極的請教同事,下班后我在宿舍里瘋狂的肯C++, 在網上下載了教材。一行一行認真的讀,上機練習,從基礎開始。一步一步的來。在剛開始的一個月里,幾乎每天都是凌晨才休息。但是我覺得很欣慰,因為我逐漸適應工作了,而且覺得越來越理解C++ 的內涵。連續這樣3 個月后,我終于對工作得心應手了,VC 的底子也逐漸厚實?;叵朐瓉淼囊估勺源螅娴暮芎眯Α,F在我對C++ 無疑是敬畏的。原來以為自己有多厲害,其實自己差得要命。不懂虛函數有什么用,不知道除了構造函數,析構函數外還有拷貝函數,還有深淺拷貝之分。不懂什么是多態,不懂什么是抽象類,不知道C++ 里居然還有個STL 庫。隨便拿本VC 的書就寫程序,甚至不知道APP WIZARD 生成程序的入口。
經過了三個月的苦心孤詣終于有點眉目了。我沒有直接用VC,而是從SDK 入手,用SDK 寫了將近一個月的程序。終于知道了windows 里面居然還有消息機制,每個應用程序還有消息隊列。編譯器分配存儲空間的時候居然還有內存對齊。這些新奇的東西讓我興奮,我每天如饑似渴的讀著各類電子書。
《深入淺出MFC 》, 《高質量C/C++ 編程》,都是我的寶貝。是的,正象很多人說的一樣,沒有幾年是無法精通VC 的。但是,我們無需精通每個方面,我們只需足夠熟悉我們工作所用到的部分。DLL, 數據庫,組件技術,圖形技術,進程調度,多線程等等,網絡...太多太多了,MFC 是如此的龐大。也許是我心高氣傲,當經理跟我說轉正給我3000 的時候,我拒絕了,我覺得自己可以拿更高的薪水。于是我辭職了。
這次的離職,沒有給我帶來什么憂慮,可能通過前斷時間的學習有了些許的底氣??赡艽蠹液芷婀郑瑸槭裁瓷衔亩啻翁岬焦べY,請原諒我的俗氣!當愛情不能依靠時,金錢是能唯一給我安全感的東西。
這一次我打算找名氣稍微強一點的企業。正好,TX 公司正開招聘會。我一大早趕到招聘會現場,很熱鬧,已經有很多人在那里面試了。等了大約半個小時,終于輪到我了。面試官沒有象我想象的那樣提一些基礎知識,而是直接問我對UML 怎么理解,對UI 設計有什么心得這些抽象的問題。我回答得吞吞吐吐,語無倫次,結果是可想而知的。55555555,真的好慘,這個全國著名的SP 把我就這樣簡單的拒絕了,好打擊人啊。但是這次來并非沒有收獲,因為在我走出招聘會場的時候,我留意到unix/linux 展臺門可羅雀,于是一個計劃又在我內心醞釀。我回家后在網上搜集linux 入門資料,然后把電腦硬盤格式化,為了表示學習linux 的決心,我給windows15G,給了linux 25G,就這樣開始了我的學習linux 之旅!
第二天,我從朋友那里打聽到GDNT 有個招聘會,于是又風風火火的趕去。GDNT 的面試也給了我重重一棒子,讓我好痛苦。在痛苦中過了3 天后,一個高中同學說她們單位要招VC 方面的人。我當時真的很高興,也很緊張,因為這次面對的公司是中國著名電信運營商的研發中心。由于朋友的引見,面試很快確定在2 天后。在這兩天里,我把所有關于C/C++ 的知識點復習了一遍,然后閱讀了一些網絡方面的資料。果然功夫不負有心人,2 個小時的比試面試過去了,我成了她們的一員。最后PM 許諾試用期給我4K。
這里的工作環境很好,工作也比較輕松,也許所有國企都是這樣的把。下午2:00 上班,中午可以休息兩個小時。單位食堂的伙食豐富而且價格便宜,一般不超過5 元,最令人覺得溫馨的是飯后偶爾還會發水果。:)真的是好幸福,呵呵。在這里主要做的是一些交換網管系統,在這期間我跟PM 學了不少東西。熟悉了HW,ZTE 的很多產品,以及COBAR 接口規范。私下還對7 號信令做了比較詳細的閱讀,而且對很多網絡協議有所了解了,比如SNMP,RIPv2、OSPF、IGRP,還學會了怎樣使用CLEARCASE 等工具。但是,最大的收獲莫過于對UNIX 的學習了。在這里有很多UNIX 機器,HP*UNIX ,IBM*AIX,SUNOS 等等。。
每天下班后我沒有直接回家,而是留在了單位telnet 到SUNOS 上,開始了我學習unix 的計劃。幾乎天天都是10:00 以后才離開單位, 搞不懂的就問人或者在網上找資料。回家以后,我繼續在linux 上學習一直到轉鐘。這期間我真的學了很多,跟windows 上寫程序完全不同了,似乎更關心細節,更關心操作系統了。經過大約3 個月的摸索,終于對unix 有所了解了,覺得好多東西豁然開朗。進程通訊,進程管理,頁面置換,信號燈,線程池這些東西是我在windows 下寫程序從未接觸過的。
覺得學習unix 真的很幸福,每天進步一點,會讓我睡得踏實。把《unix 高級環境編程》學完后,我開始慢慢的請教前輩,有關嵌入式的開發的問題。
慢慢學著分析內核情景,裁減內核,底層的東西讓我覺得好奇。還有一件讓人特興奮的事兒,咱們科室好多開發人員都是女同志,PM 也是女人。
時間飛快,轉眼四個月已經過去了。我覺得是時候該離開這個安逸的國企了,說真的,真有些舍不得,我向PM 提出辭職時,經理非常真誠的挽留我,說我工作做得不錯,叫我考慮考慮再走。這里的人真的很好,學習的氣氛也很濃,也許我希望日子過得緊張一些。經理說我這樣跳來跳去不利于自身的發展。也許她是對的,也許是我太倔犟,終于還是走了。我知道,當我交出那張卡,就再也不能回來了,走出大門站在華景的天橋上我默默的站了10 分鐘,仰望著那熟悉的大廈。
晚上回去改了改簡歷,然后在網上投。躺在床上,看著天花板,突然之間覺得好孤單,這里一個親人也沒有,鼻子很酸,好想哭。客廳電視機里傳來世界杯預選賽的吶喊(我和一個男生一個女生合租三室一廳)。我走出客廳和那個男生談了很多,也知道了他很多事情。現在才知道,雖然是合租,但是彼此溝通真的很少。他原來是在XTKJ 工作,后來跳到外企,也是搞IT 的,也是程序員。一個人到南方。
當時聊了很多,不覺到了凌晨。不過我們都沒有睡意,于是他問我會是際否,我一拍即合。他很驚訝的看著我:你真的會。我說試試就知道。于是我們各自回房打開電腦,比賽開始了,呵呵。也許是他太輕敵,第一場,我選蟲族,他選人族,結果被我出快狗偷襲成功,不過后來幾場我都輸得很慘,呵呵。
第二天睡到中午才起來,1 點多的時候突然來了個電話,通知我去面試,職位是linux 程序員。我趕快打扮起來:)。照鏡子才發現,自己瘦了好多,也憔悴了不少。我穿上了自己最漂亮的衣服,然后簡單了畫了一下眉,打了粉底和眼影,并且還畫龍點睛的摸了腮紅。呵呵,自己對著鏡子傻笑。
到了面試的公司(一個剛成立不久的外企,VOIP 設備商),和PM 談得很順利。他問的問題也很簡單:函數傳值傳址的區別,常用的進程通訊方式,和我做過的一些項目等等。最后PM 問我期望的薪水是多少。我怯怯的說了句:5K。經理摸了摸前額想了想對我說:這樣把,你好好干,試用期我給你5.5K。出了公司門,感覺天空一片蔚藍。
經驗分享
(五)一個還不太老的程序員的體會
(一)文章由來及個人經歷
我是一名計算機專業的本科畢業生,畢業已經1 年多了。畢業后從事的是軟件編程工作,經常有其他專業的朋友想從事軟件編程工作,向我請教如何,因為我自覺涉行不深,不敢信口開河,無奈朋友信任,我不得不鄭重考慮一下這個問題了,來幫助朋友選擇和回報朋友的信任。這也就是此文的由來。
還是先談談我個人的經歷吧。(是不是有點俗套,但我覺得了解我的經歷,有助于理解我話的含義;我一向認為不了解古龍的生活經歷的,不會真正讀懂古龍的作品和古龍筆下的英雄的)我本科就讀于南方一所著名的高校(因為自己的不成氣,愧談母校名謂),學的就是計算機專業。上本科時,幾乎沒有認真的聽完一門專業課程,上課看報紙睡大覺,下課看錄像看小說看球賽,臨考抱佛腳,每次考試和課程設計都是蒙混過關。(于之相對是,我選修的工商管理和經濟貿易方面的課到是聽得不亦樂乎,考的分數頗高,也許這才是我的真正興趣所在。)
總而言之,大學是混過來了,對專業的理解和掌握程度,應該沒有達到畢業要求的合格水平。(也很后悔,但是有什么用呢,當時不知道珍惜;如果上天再給我一次機會的話,我一定會抓住,多看點美國大片少看點港片;現在,重回校園是我的一大理想)但是大學的學習使我有了一個簡單的知識框架(總算學費沒白交),我對一個朋友這樣形容過我的這個知識框架,“它不是鋼筋鑄的,是稻草扎的”,哈哈哈,不要笑,真的,我敢說很多本科畢業的朋友的本專業的知識框架也只不過是“稻草扎的”。直到現在,我一直覺得自己的基礎知識還是很薄弱,一直想抓點時間,把基礎書本好好的溫習一下。(此項任務正在計劃和實施中)
畢業后,分配到某研究所工作。當領導讓我選擇自己以后的工作方向時,我毫不猶豫的選擇了軟件(也不知道到底是對還是錯,但我決不后悔)。此研究所主要是以硬件為核心搞通信控制設備的研發生產;軟件是輔助,所以也不受什么重視,很多搞軟件的人都跳槽走了,留下來的大都是一些已經廢掉和行將廢掉的“偽/ 萎”程序員(名副其實的“軟件人員”)。在這里感覺不到什么高緊張和高技術程度的研究和開發;軟件開發的技術含量極低,以致于大部分人只有半年的學習和開發經驗,以后都是這些知識和經驗的重復利用。(我問過其他到研究所工作的同學,他們說都一樣,嗚呼,我們的國防科研開發呀)對于軟件的開發,領導的意志和老掉牙的經驗在新課題的技術采用和開發中起了決定性作用,沒有明確的需求,沒有明確的開發計劃和進度,大家在一天一天一周一周的浪費著寶貴的時間,最后開發出來的東西修來改去,直至它變成垃圾。我越來越認識到一點,要么象那些廢人一樣廢掉,要么自己去努力尋求出路,反正別指望從工作中得到什么高明的經驗了(教訓倒也許有)。期間發生了一些感情上的糾紛,嚴重的影響了學習計劃和效果,直到現在浮躁的心仍然有些浮躁。
期間,我讀了一些書,看了一些文章,編過一些小例程,搞了一些沒有什么技術含量的開發工作,也和一些前輩和高手們談過聊過。我一直在思考幾個問題;如何學習軟件開發?如何搞軟件開發,國外的軟件開發到底其秘訣在何處?為何我們的軟件業一直在低水平徘徊?我們難道真的離了Microsoft 就活不了?我們的程序員到底在浪費時間干些什么?軟件開發到底是如何分類的?我們如何走自己的民族軟件之路?
我想了很久,一些想通了,一些還在想。但我知道有一點是肯定的,那就是我們一定要靠我們自己走出自己的軟件之路!跟在別人屁股后面永遠受制于人!
好了,關于經歷和牢騷就先寫這些吧,該進入我們的正題了。
(二)你適合當程序員嗎,你知道編程序是怎么回事嗎? 1、程序員意味著要編程序。(如果你僅僅想得到一份高薪水的工作,喝喝咖啡就等老板發薪水,我奉勸你還是另找一份更合適的工作,譬如練攤,真的,兄弟,這份工作不適合你)、你是學文的還是學理的,編程序也許需要浪漫,但更需要邏輯和嚴謹。(說坦白點就是,在你沒有找到樂趣以前,它很枯燥)、你有對新技術追求的熱情嗎?你有刨根問底的探索精神嗎?(熱情絕對是最重要的!你仔細思考一下自己的性格適合當程序員嗎?)、當程序員決不是什么好差事,時刻需要學習,需要思考。(直到你成為那個可以引導別人去學習和思考的人,你才可以偷偷的嘿嘿笑,又一群傻蛋)、程序員的未來很迷茫。(但我認為關鍵看你自己!我希望你是一個有追求的人,不僅僅是混碗飯吃。因為真正的樂趣在于創造;如果你能改變軟件業的歷史,那才是英雄;不想成為Bill Gates,不想成為Dennis Ritchie 和 Bjarne Stroustrup,我會說你沒有追求。有個關于程序員未來的笑話,也許你還沒聽過,你該聽一聽,摘抄如下:
一個程序員對自己的未來很迷茫,于是去問上帝。“萬能的上帝呀,請你告訴我,我的未來會怎樣?”
上帝說“我的孩子,你去問Lippman,他現在領導的程序員的隊伍可能是地球上最大的”
于是他去問Lippman。
Lippman 說“程序員的未來就是駕馭程序員”
這個程序員對這個未來不滿意,于是他又去問上帝?!叭f能的上帝呀,請你告訴我,我的未來會怎樣?”
上帝說“我的孩子,你去問Gates,他現在所擁有的財產可能是地球上最多的” 于是他去問Gates。
Gates 說“程序員的未來就是榨取程序員”
這個程序員對這個未來不滿意,于是他又去問上帝。“萬能的上帝呀,請你告訴我,我的未來會怎樣?”
上帝說“我的孩子,你去問侯捷,他寫的計算機書的讀者可能是地球上最多的” 于是他去問侯捷。
侯捷說“程序員的未來就是誘惑程序員”
這個程序員對這個未來不滿意,于是他又去問上帝?!叭f能的上帝呀,請你告訴我,我的未來會怎樣?” 上帝搖搖頭“唉,我的孩子,你還是別當程序員了”)
6、當程序員還是很有樂趣的。(當你學到新知識時,當你有新的思想見解時,當你有新的產品問世時,和知己探討你的成果時…我問你,覺得這些是樂趣嗎?)、當程序員不易也不難。(世間事有難易乎?為之…;不為…。你有決心和信心嗎?)、你真的要當程序員?是你自己的想法?、你舍得花錢買書嗎?(讀好書絕對是學習編程的最佳捷徑。你一定會說,現在電腦書籍真T.M.D 貴,沒法子,誰讓知識和技術在人家的腦袋,在人家的書里呢;等你寫書時可以把價格定低一點,記著還有好多沒錢但想買書的兄弟很困難呀。要舍得買書,買好書,不好的的書不如不讀,其害大于其益,關于買什么書,你可以問高手或看候捷的書評;準備一個小本子記錄你想買的書的名字,逛書店時看看,如果好就買下,記住要讀,別光買不看。)、我告訴你,程序就是:任何有目的的、預想好的動作序列,它是一種軟件。、編程序就是編寫程序。、你想好了嗎?(如果你想好了還是決定要當程序員,可以繼續往下讀;否則,你可以繼續尋找別的出路了。)
(三)一個程序員應該具備的基礎知識和概念、計算機是有什么組成的,CPU 是什么東西,其工作原理是什么。(對于這些以及下面將要提到的概念我不會告訴你什么答案,你可以看相應的教材,關于教材我會在下一部分詳述,記住理解最重要?。?、機器語言和微指令集的概念。、程序的概念。、匯編語言是低級語言但不是機器語言。、高級語言主要有那些?(C,C ++,Basic,Pascal,Fortran,C#,Java 等等;如果你是中國軟件業的英雄,你也寫一門語言,最好不用英語)6、編譯程序和解釋程序的概念和其原理。(編譯器是高手和專家編寫的)、HTML、XML 等是標識性語言。
8、Prolog 是人工智能語言。、操作系統OS 的概念和原理。(Windows98,Windows2000,Windows NT,UNIX,Linux,等等都是OS,還有一些實時OS,嵌入OS,編這些的絕對是高手)、Windows 編程說白了就是Windows API 的調用。(中國的程序員很多只是會編windows 程序,用的是VB,我的建議是這些程序員頂多只是低級編碼員,我稱其是coder)、VC ++、VB、BC、BCB、Delphi、VF 等都只是編程的工具和環境,不是編程語言。、面向結構的設計概念。、面向對象的概念。(好好理解,兄弟,這個東西還是很重要的)、軟件工程的概念和原理。(如果你想當老總就需要好好研究了,系統分析員比編碼員要高一個等級,薪水也高喲)、數據庫的概念。(要熟悉一些著名的數據庫系統和語言的名字,如Orcle,SQL,DB2,DyBase等)、了解網絡概念。、了解多媒體概念。、熟悉和掌握數據結構和基本算法。、是不是要求太高了,別著急慢慢來,進步在不知不覺之中。(一旦開始學習,一個月以后你就會有一個基本的概念;兩個月以后你就會感覺自己有了全面的基礎知識;當你知道編程序是怎么回事時,說明你已經入門了。也有很多人編了很多年程序還沒有入門呢,你不會希望自己步其后塵吧。要有信心和耐心。沉不住氣怎么能成大事??。?/p>
(四)教材推薦
推薦的教材主要還是針對概念來的,最好選用名校的教學用書。、《計算機組成原理》(熟悉)2、《數據結構》(掌握)3、《操作系統》(了解*> 熟悉)4、《The C language 》(掌握)5、《編譯原理》(了解原理)6、《匯編語言》(了解)7、《計算機網絡》(了解)8、《軟件工程》(了解)9、《關系數據庫》(熟悉)、《The C ++Languege 》(掌握)、《面向對象設計》(掌握;結合C++ 學習)
(五)一些經驗和體會
(五)一些經驗和體會、真正的程序員用C++ ;(一位專家說的)2、動手去編程序; 3、動腦去思考;、要有良好的編程風格;、讀書,讀好書,盡量讀原版書?。ㄎ曳磸蛷娬{這一點,讀書要有選擇,堅持讀好書,名家出的經典書,不要浪費實踐在一些粗制濫造的書上面;堅持博覽群書)6、有自己的學習計劃;、總結自己的經驗教訓;(準備一個筆記本,記錄錯誤和心得)8、不要怕學新東西; 9、要有軟件工程的思想;、善于發現問題,然后去尋找答案; 11、向高手請教;(要虛心直到你成為高手)12、和同行交流;(不善于交流肯定不行)、懂得軟件的實質,不要被千變萬化的表象所迷惑;、真正要學習用的是編程語言和方法,不是什么庫,什么類,什么工具;(學用那些什么庫都比較簡單,但 光會這些庫,我覺得還遠遠不夠)、學習wiodows 編程主要是學習windows OS 和win32 API ; 16、有空了解一下嵌入式開發; 17、有空了解一下PDA 軟件開發;、了解一下.NET 框架和C# 語言,也許它是你新的衣食父母;、要有耐心,不要作浮躁的人; 20、對程序加注釋,并保留你的老程序; 21、學到的東西越多,了解的越多,你就越接近專家; 22、有空去逛逛CSDN,那里有你很多知己; 23、要有信心成為一個優秀的程序;
(六)一些好書的推薦、《The C Programming language 》(Keinighan & Dennis Ritchie 1988)2、《The C++ Programming Languague 》(Bjarne Stroustrup 1997)3、《Inside The C++ Object Model 》(lippmans)4、《Effective C++ 》(同上)5、《More Effective C++ 》(同上)6、《Exceptional c++ 》 7、《C++ 面向對象高效編程》 8、《設計模式》 9、《Thinking In C++ 》、《The Standard C++ Bible 》(一般推薦)11、《The Art of Computer Programming 》、《Programming Windows 》(Charles Petzold)13、《VC++5.0 技術內幕》 14、《MFC 深入淺出》 15、《軟件需求》、《Advanced Windows 》 17、《C++ primer 》、《win32 程序員參考手冊》 19、《用TCP/IP 進行網際互連》 20、《COM 本質論》
(七)學習計劃
這個學習計劃是我個人定的,也共享給大家參考一下,共同進步吧。、《計算機組成原理》 2、《操作系統》 3、《數據結構》 4、《匯編語言》 5、《 C 》 6、《 C++ 》 7、《VC 技術內幕》、《Programming Windows 》 9、《深入淺出MFC 》 10、《Advanced Windows 》、《Inside The C++ Object Model 》 12、《Thinking in C++ 》 13、《Effective C++ 》 14、數據庫 15、網絡、嵌入式OS 和編程 17、硬件單片機 18、.NET 和C# 19、軟件工程 20、UNIX 和Linux
(八)后記
一年來浪費了大量的時間去摸索,去思考,走了很多的彎路,直到現在我還覺得自己是個編程的門外漢。我把我的一些體會和想法說出來(當然,很多都不一定正確,歡迎大家指正和討論),也許對一些想加入程序員行列的朋友有一些建議和幫助。希望能幫助這些朋友順利走上編程之路,成為高手。
如果真能如此,我也就很高興了。歡迎有興趣的朋友給我發E_mailsjpsky@163.net);我這個人有兩大業余愛好,其一就是讀武俠小說,其二就是結交英雄俠士。
后記:此文我用analyster 的名字登錄,發表在“csdn -程序人生”上了,有很多網友看了,回了,還收到幾個網友發來郵件,和我探討,我很感謝大家對我的信任和鼓勵。
我要說明的就是我的這篇小文,主要是想給“一些想成為程序員”的朋友一些建議,幫他們尋找一條自我培訓的捷徑,(其實世界上沒有什么捷徑的,我覺得一切都在于悟性,師傅領進門,修行在個人,譬如我就修行不夠)少象我一樣作大量的無用功。還有,主要就是一個程序員應該具備的基本功(個人看法), 有人稱其為“內功”,我覺得很對。沒有扎實的基本功,我們如何能夠做到游刃有余的編寫高質量高性能的優秀程序呢?
經驗分享
(六)一個程序員給初學編程人的建議!絕對的好!
想學習程序設計而又很迷惘的朋友,希望可以帶來一點幫助。
我第一次接觸電腦是在小學二年級的時候。那時純粹是因為喜歡打電子游戲,聽別人說電腦上的游戲十分好玩,于是就漫漫開始與之接觸了。在三年級時父母出于我對計算機濃厚的興趣送我去了一個BASIC 編程學習班,從那時起我才真正開始走上編程這條不歸之路。雖然說現在程序設計這門專業在社會上很熱,競爭十分激烈,但是這只是學習編程的人比較多而已。真正能夠掌握以至于精通的人實際上很少,畢竟中國的軟件業才剛剛起步不久。現在社會對優秀的程序設計人員的需求量還是相當大的,但是前提是必須要優秀。我自己雖然也談不上優秀,但多少還是有些感觸。在這里想講述自己對于一般程序員和優秀程序員之間在技術上的一些認識(什么敬業精神生活態度我就不多說了):
首先作為一個優秀的程序員,數學是十分重要的。數學是自然科學的基礎,計算機科學實際上是數學的一個分支。數學主要能讓人懂得一種分析問題的方法,然后再通過編程去實現它。計算機內部的許多原理也都牽涉到比較復雜的數學知識。它是我們用來解決現實問題的最高效的工具。很多學習編程的朋友對數學覺得不屑一顧,覺得對于編程沒有什么關系。實際上優秀程序員和一般程序員拉開檔次很大一個程度上就是取決于對數學的能力。一些項目有時需要很復雜的數學建模和利用數學對于系統效率進行分析,而這些項目對于一般的程序員是很困難的。正確應用數學知識有時候能使你的程序的效率產生質的飛躍。現在的程序員在數學上普遍是薄弱環節,這點是大家應該引起足夠重視的。當別人對于這些項目感到無從下手,而你卻能夠完成,這個時候你的價值也就表現出來了。真正優秀的程序員是能夠最基本的一點就是要能夠通過自己的知識來解決一般程序員所無法完成的問題。而數學能力就是一個很重要的環節。
其次就是要對數據結構引起足夠的重視。如果說計算機專業的學生與非計算機專業的最根本的差別絕對是數據結構(數學大家都一樣學了,主要看你自己學得好壞)。對數據結構的掌握與運用能力是衡量你編程能力的一個很重要的指標。有的人對于看了鏈表,棧,樹,廣義表這些東西就頭痛。然而這些東西往往能使你的程序的效率比別人高出百倍。由于一直搞信息學競賽,到了大學又搞ACM,所以我對數學和數據結構都掌握得相對較好。這使我在應聘與工作中明顯感到勝人一酬。記得自己大學時去一家公司應聘的經歷,當時去應憑的還有3 個人,有2 個大學畢業,有個也工作了一段時間了。他們幾個都在大講自己的能力如何之強,會使用的語言及編程工具如何之多,經驗如何之豐富。按理說我應該是資質最淺的。當時也是初生牛X 不怕虎,也就硬著頭皮去了。當時面試的題目是一個公司的資金管理項目的一個問題,要求每個人都在思考后給出自己的設計方案。其中比較核心的一個問題就是要計算一個資金最小波動值的問題,給出的數據量相當大,對效率要求很高。對于整個程序的面向對象化的分析我們幾個都是差不多的,畢竟這些東西在學校里是很重視的,而且不是真正的難點。然而到了最關鍵的問題時其余的人都卡殼了,有兩個是用簡單的雙重循環,時間復雜度(N^2),慘不忍睹。還有一個在冥思苦想了好一陣以后說用樹,具體技術細節又講不清楚,效率分析也很馬虎。只有我當時很快就給出了采取AVL 樹的方案,并且利用高等數學推導作出了很詳細的效率分析和時空換算,并提出了引入匯編的方法。很自然的我得到了這分工作。在這里大家顯然可以看到數學和數據結構對于一個優秀程序員是多么重要,它們是和一般的程序員打開檔次的最關鍵的地方。這樣向“棗子”碰到的那種情況應該很輕松的就可以想到。
如果你是一位想學習編程的朋友,我經過多年的學習總結出來了一個學習的線路希望對你有所幫助。要學習編程是要有很大恒心和毅力的,首先你要明確自己的目標,想好自己編程是為了干什么。如果你學習僅僅只是一時想編出QUAKE 和成為比爾蓋次的沖動,那么我勸你還是應該還是不要開始學習,應為這樣的目標很難支持你日后大量的學習。而且你的年齡不能太大(最好是中學或者大學生)。如果你想好目標并決定開始奮斗,那就讓我們開始吧。如果你一開始對電腦一無所知,那么你應該先熟悉一些電腦的一些最基本的原理和操作,這個不需要特別細致的學習,只要大概知道二進制和一些基本操作就可以了。接下來你應該先學習BASIC 語言,這個語言并不會耽誤你太多的時間,學習它完全是為了入門,讓你對電腦編程有一個比較初步的認識。這時候你應該多編一些小的程序,知道一些最基本每條語句的功能,搞清楚一些基本的數據結構(尤其是數組)對于一些其余用途的函數最好不要做任何學習,因為這樣只會分散你的注意力。當你能夠可以熟練的運用BASIC 編出猴子選大王,以及電腦出題考試之類的程序時,你就可以開始后面的學習了。接下來如果覺得自己接受能力強的話就可以開始學C 了(注意不是C++),如果感覺有困難也可以先學Pascal 過度一下。還有很重要的一點就是千萬不要一開始就學VB,DELPHI,VC之類的東西,這些東西在一開始學會對你造成很壞的影響。有可能會把你引入另外一個錯誤的學習方向而忽略了真正應該掌握的東西。學C 主要是學過程話的程序設計,學會把自己的程序分成許多的函數(或過程),養成良好的編程習慣。這時可以多看一下高人的程序,不一定要懂意思,主要是學會別人程序的格式(比如變量如何起名,怎么劃分函數)。除開掌握基本的控制流語句外,應該學習一些很簡單的I/O 函數和數學函數。C 的學習主要是你舍棄原來BASIC 程序那種把所有語句積成一大堆的風格,要學會使用函數,提高代碼重用性。對于指針之類的東西如果實在看不懂可以先不去管,到后面會有辦法。當你能夠比較自如的用C 編寫一些小的計算程序時,你就可以開始你的數據結構的學習了(數學的學習主要是在學校,自
己要多用心)。數據結構你可以一點一點漫漫看,并不需要專門空出一段時間來專門研究,這樣的目的是讓你能夠很好的掌握它,要學會用數據結構的知識來規范自己的程序設計和提高程序的效率。學完C 我認為接著最好學習匯編。這個或許有許多人都會反對,然而我個人認為這樣是很好的。從最基本的DOS 匯編開始,買本《IBM PC 匯編程序設計》(清華黃皮)一定要一點一點吃透,實在看不懂就跳,反復的嚴讀是一定可以看懂的。匯編是一定要掌握的,因為它涉及到很多最基本的知識。掌握了匯編和對I/O 有了個很徹底的認識后,應該去學編譯原理。這個東西并不要精通,但是一定要知道,在大腦里要有一個這樣的概念,這對你對程序語言的控制能力都有很大的幫助。這樣最基本的學習就算完成了。一般智力正常的人前一段東西應該都是可以掌握的。接著后面的學習就要看你自身的造化了。這個時候你應該研究一下數據結構,不要分散自己學習的注意力,要知道數據結構是異常重要的(相信我,絕對沒錯)如果你覺得自己已經對于樹,連表,堆棧之類的東西和排序,遞歸之類的算法已經十分清楚,就可以開始學習C++了。學習前一定要有個正確的認識,那就是C 和C++ 是兩個不同的東西。學習C++ 是為了學習面向對象的程序設計,這個時候你對于指針應該也能夠掌握了(有匯編的基礎),主要抓住C++ 和C 相比的一些新特性,對于多態之類的特性要注意理解掌握,如果沒有搞懂就堅決不要往下學習。一些基本的概念掌握以后可以看一些別人設計的程序,學習別人怎么利用面向對象的方
法來設計程序的。這個東西也是人之間拉開檔次的一個環節,可以和數據結構放在同等重要的地位。我就見過有的人都大學畢業了還搞不懂virtual 到底是怎么一回事情。其實我認為學到這里你已經為你成為一個優秀的程序員打下了很好的基礎,你已經能夠應用C++,懂得面向對象程序設計,對數據結構掌握很好,掌握匯編和編 譯原理。接下來的學習就是基于操作平臺的了,一般是先學windows(Microsoft 畢竟是老大),先學win32api,搞請windows 基本消息機制和原理,有匯編基礎基本上不會碰到什么困難。其實只要會了API,其余什么MFC,VCL 都是囊中之物了,都不過是對于API 的小裝而已。VC,C++Builder 都可輕松拿下,這只是開發工具的問題。以后的OLE(ActiveX),.NET,數據庫就要看自己的發展方向而定了。我在這里強調的是前面的基本能力的學習,后面操作平臺雖然知識體系龐大,然而畢竟比較死,更好掌握。最后編程能力的高低主要還是有以下幾點決定:1。編程的習慣 2。數學能力(包括邏輯思維,分析問題的能力)3。對數據結構的認識能力 4。經驗的多少(包括多使用語言的掌握能力)。
經驗分享
(七)算法的力量
算法是計算機科學領域最重要的基石之一,但卻受到了國內一些程序員的冷落。許多學生看到一些公司在招聘時要求的編程語言五花八門,就產生了一種誤解,認為學計算機就是學各種編程語言,或者認為,學習最新的語言、技術、標準就是最好的鋪路方法。其實,大家被這些公司誤導了。編程語言雖然該學,但是學習計算機算法和理論更重要,因為計算機語言和開發平臺日新月異,但萬變不離其宗的是那些算法和理論,例如數據結構、算法、編譯原理、計算機體系結構、關系型數據庫原理等等。在“開復學生網”上,有位同學生動地把這些基礎課程比擬為“內功”,把新的語言、技術、標準比擬為“外功”。整天趕時髦的人最后只懂得招式,沒有功力,是不可能成為高手的。
算法與我
當我在1980 年轉入計算機科學系時,還沒有多少人的專業方向是計算機科學。有許多其他系的人嘲笑我們說:
“知道為什么只有你們系要加一個?科學?,而沒有?物理科學系?或?化學科學系?嗎?因為人家是真的科學, 不需要畫蛇添足,而你們自己心虛,生怕不?科學?,才這樣欲蓋彌彰?!?其實,這點他們徹底弄錯了。真正學懂計算機的人(不只是“編程匠”)都對數學有相當的造詣,既能用科學家的嚴謹思維來求證,也能用工程師的務實手段來解決問題——而這種思維和手段的最佳演繹就是“算法”。
記得我讀博時寫的Othello 對弈軟件獲得了世界冠軍。當時,得第二名的人認為我是靠僥幸才打贏他,不服氣地問我的程序平均每秒能搜索多少步棋,當他發現我的軟件在搜索效率上比他快60 多倍時,才徹底服輸。為什么在同樣的機器上,我可以多做60 倍的工作呢?這是因為我用了一個最新的算法,能夠把一個指數函數轉換成四個近似的表,只要用常數時間就可得到近似的答案。在這個例子中,是否用對算法才是能否贏得世界冠軍的關鍵。
還記得1988 年貝爾實驗室副總裁親自來訪問我的學校,目的就是為了想了解為什么他們的語音識別系統比我開發的慢幾十倍,而且,在擴大至大詞匯系統后,速度差異更有幾百倍之多。他們雖然買了幾臺超級計算機,勉強讓系統跑了起來,但這么貴的計算資源讓他們的產品部門很反感,因為“昂貴”的技術是沒有應用前景的。在與他們探討的過程中,我驚訝地發現一個O(n*m)的動態規劃(dynamic programming)居然被他們做成了O(n*n*m)。更驚訝的是,他們還為此發表了不少文章,甚至為自己的算法起了一個很特別的名字,并將算法提名到一個科學會議里,希望能得到大獎。當時,貝爾實驗室的研究員當然絕頂聰明,但他們全都是學數學、物理或電機出身,從未學過計算機科學或算法,才犯了這么基本的錯誤。我想那些人以后再也不會嘲笑學計算機科學的人了吧!
網絡時代的算法
有人也許會說:“今天計算機這么快,算法還重要嗎? ”其實永遠不會有太快的計算機,因為我們總會想出新的應用。雖然在摩爾定律的作用下,計算機的計算能力每年都在飛快增長,價格也在不斷下降??晌覀儾灰?,需要處理的信息量更是呈指數級的增長?,F在每人每天都會創造出大量數據(照片,視頻,語音,文本等等)。日益先進的記錄和存儲手段使我們每個人的信息量都在爆炸式的增長?;ヂ摼W的信息流量和日志容量也在飛快增長。在科學研究方面,隨著研究手段的進步,數據量更是達到了前所未有的程度。無論是三維圖形、海量數據處理、機器學習、語音識別,都需要極大的計算量。在網絡時代,越來越多的挑戰需要靠卓越的算法來解決。
再舉另一個網絡時代的例子。在互聯網和手機搜索上,如果要找附近的咖啡店,那么搜索引擎該怎么處理這個請求呢?
最簡單的辦法就是把整個城市的咖啡館都找出來, 然后計算出它們的所在位置與你之間的距離, 再進行排序, 然后返回最近的結果。但該如何計算距離呢?圖論里有不少算法可以解決這個問題。
這么做也許是最直觀的,但絕對不是最迅速的。如果一個城市只有為數不多的咖啡館, 那這么做應該沒什么問題, 反正計算量不大。但如果一個城市里有很多咖啡館, 又有很多用戶都需要類似的搜索, 那么服務器所承受的壓力就大多了。在這種情況下, 我們該怎樣優化算法呢? 首先,我們可以把整個城市的咖啡館做一次“預處理”。比如,把一個城市分成若干個“格子(grid)”, 然后根據用戶所在的位置把他放到某一個格子里,只對格子里的咖啡館進行距離排序。
問題又來了,如果格子大小一樣,那么絕大多數結果都可能出現在市中心的一個格子里,而郊區的格子里只有極少的結果。在這種情況下,我們應該把市中心多分出幾個格子。更進一步,格子應該是一個“樹結構”,最頂層是一個大格——整個城市,然后逐層下降,格子越來越小,這樣有利于用戶進行精確搜索——如果在最底層的格子里搜索結果不多,用戶可以逐級上升,放大搜索范圍。
上述算法對咖啡館的例子很實用,但是它具有通用性嗎?答案是否定的。把咖啡館抽象一下,它是一個“點”,如果要搜索一個“面”該怎么辦呢?比如,用戶想去一個水庫玩,而一個水庫有好幾個入口,那么哪一個離用戶最近呢?這個時候,上述“樹結構”就要改成“r*tree ”, 因為樹中間的每一個節點都是一個范圍,一個有邊界的范圍(參考:http://)。這個算法能夠在很多種計算中達到相當高的效率,而且是可擴展的(也就是說,一千臺機器就算不能達到一千倍的效果,至少也可以達到幾百倍的效果)。Map and Reduce 的另外一大特色是它可以利用大批廉價的機器組成功能強大的server farm。最后,它的容錯性能異常出色,就算一個server farm 里面的機器down 掉一半,整個farm 依然能夠運行。正是因為這個天才的認識, 才有了Map and Reduce 算法。借助該算法,Google 幾乎能無限地增加計算量,與日新月異的互聯網應用一同成長。
算法并不局限于計算機和網絡
舉一個計算機領域外的例子:在高能物理研究方面,很多實驗每秒鐘都產生幾個TB 的數據量。但因為處理能力和存儲能力的不足,科學家不得不把絕大部分未經處理的數據丟棄掉??纱蠹乙溃略氐男畔⒑苡锌赡芫筒卦谖覀儊聿患疤幚淼臄祿锩妗M瑯拥?,在其他任何領域里,算法都可以改變人類的生活。例如人類基因的研究,就可能因為算法而發明新的醫療方式。在國家安全領域,有效的算法可能避免下一個911 的發生。在氣象方面,算法可以更好地預測未來天災的發生,以拯救生命。
所以,如果你把計算機的發展放到應用和數據飛速增長的大環境下,你一定會發現,算法的重要性不是在日益減小,而是在日益加強。
給程序員的七個建議
(1)練內功。不要只花功夫學習各種流行的編程語言和工具,以及某些公司招聘廣告上要求的科目。要把數據結構、算法、數據庫、操作系統原理、計算機體系結構、計算機網絡,離散數學等基礎課程學好。大家不妨試試高德納所著The Art of Computer Programming 里的題目,如果你能夠解決其中的大部分題目,就說明你在算法方面有一定的功力了。
(2)多實戰。通過編程的實戰積累經驗、鞏固知識。很多中國大學畢業生缺乏編程和調試經驗;學習C語言,考試過關就算學會了;課題項目中,只要程序能夠編譯,運行,并且輸入輸出滿足要求就算了事。這些做法是不行的。寫程序的時候,大家必須多想想如何把程序寫得更加精煉、高效、高質量。建議大家爭取在大學四年中積累編寫十萬行代碼的經驗。我們必須明白的是:好程序員是寫出來的,不是學出來的。
(3)求實干。不要輕視任何實際工作,比如一些看似簡單的編碼或測試。要不懈追求對細節一絲不茍的實干作風與敬業精神。我發現不少程序員對于知識的掌握很膚淺,不求甚解,沒有好奇心,不會刨根問底。比如,學會了C++,是否了解一個對象在編譯后,在匯編代碼中是如何被初始化的?這個對象的各個成員在內存中是如何存放的?當一個成員函數被調用時,編譯器在匯編代碼中加入了哪些額外的動作?虛函數的調用是如何實現的? 這些東西恐怕在編程語言或編譯原理中都沒有詳細提到,只有通過踏實的實干才能真正掌握。
(4)重視數學學習。數學是思維的體操,數學無處不在。學計算機至少要學習離散數學、概率論、布爾代數、集合論和數理邏輯。這些知識并不難,但是對你未來的工作幫助會很大。尤其當你對一些“數學密集型”的領域如視頻、圖像處理等有興趣時,這些知識將成為你手中的利器。
(5)培養團隊精神,學會與人合作。今天的軟件工程早已經不是一個人可以單獨操作的,而必須靠團隊合作才能成功。不懂得合作的人是不能成大器的。大家要多去尋找可以與人一起做項目的機會。
(6)激勵創新意識,培養好奇心,不要死記硬背。沒有掌握某種算法技術的根本原理,就不會有應變和創新的能力。想成為一位好程序員(其實從事任何一個行業都是如此),重要的是要養成鉆研,好奇,創新,動手,合作的優秀習慣,不滿足于填鴨,不滿足于考試交差,不滿足于表象。這不是學幾門課能夠一蹴而就的。
(7)有策略地“打工”。在不影響學業的前提下,尋找真正有意義的暑期工作或兼職。去找一個重視技術的公司,在一個好的“老板”指導下完成真正會被用戶使用的程序。不要急于去一個要你做“頭”而獨擋一面的地方,因為向別人學習才是你的目的。找工作也是一樣,不要只看待遇和職銜,要挑一個你能夠學習的環境,一個愿意培養員工的企業,一個重視你的專業的公司。最后,還要挑一個好老板。
希望大家都能把握機會,養成好的學習習慣,把算法學精學透;希望大家都能有一個美好的未來!
經驗分享
(八)不要迷失在技術的海洋中
技術就好像一片汪洋大海,越深入越望不到邊際。就拿自己的體會說吧,2000 年的時候在學校搞ASP,覺得網頁開發就是這么簡單,把數據庫中的數據格式化一下顯示在頁面上,把用戶的輸入組裝成添加刪除和修改的SQL 提交到數據庫中去。幾年后的今天,我對自己了解或聽說過的ASP.NET 相關(注意:僅僅是ASP.NET 或者說網站制作相關)技術列了一下:
在這些語言、技術、工具、理念中,每一項都能擴展出很多還要細化的技術,每一項要達到熟悉的程度可能都會花去一年的時間,如果這些都要達到熟悉的話,大概也 就快退休了。不但如此,每一個技術都在飛速發展,今年語言到了明年就有更簡單的語法,今年的技術到了明年就有更好的技術來替代,今年的工具到明年已經面目 全非,今年的理念到了明年已不再流行。
或許你現在:
在為面試而去搜索接口和抽象類的區別;
在為新技術來不及學習而煩惱;
在為看不懂高深的技術文章而煩惱;
在為項目不能提高自己的編碼水平而發愁;
????
我覺得:不管做什么,學什么,一要心態好,二要態度好。所謂心態好就是不要著急、不用擔心;所謂態度好是多分享、多討論、學出自己的心得。分享的意義是很大的,在分享之后的認知水平往往比分享之前的高,而且在很多時候分享給別人1 點,別人能回報給你2 點。有些人在團隊中不愿意分享,怕團隊中的其它人水平提升了影響到自己的地位,其實這種想法是沒有什么道理的,也是對自己不利的。有些人又在羨慕別人的技術NB,崇拜高手,為自己的技術差感到煩惱,如果你對自己信心又有什么技術是花時間學不到的那?
從學習的內容上來說,要堅持兩個原則,如果你沒有時間的話,那么學新技術不如學基礎、學應用不如學思想。舉例來說,如果你只熟悉C# 的基本語法的話,那么學好C# 這個語言比學會編寫留言本更有意義,如果你關注MVC、ORM 的話,那么學習它們的思想比學會使用MONORAIL 以及NHIBERNMATE 更好。技術雖然一直在變,但是越是基礎和越是抽象的技術變化越慢,越是偏向應用越是具體的技術變化越是快,從性價比上說,學習基礎知識性價比更高。再舉一個直白的例子,DIY 電腦的時候,在顯示器上多花費500 元的意義一定比在顯卡上多花費500 元的意義大,而就是有些人寧可在顯卡上多花費500 元。在很多大型軟件公司,招聘的時候只看人(看人品、看聰明程度、看態度)不看技術的,因為它們需要的是能快速發展,適應企業文化的人,而不需要你那些所謂的精通和熟悉。
不要過于專著于技術,這里的技術指工作中用于開發的技術。在幾年之后,當你只有.NET 可以和你的孩子分享的話,是不是太可悲了。在軟件行業,技術雖然一定程度決定了薪水、決定了職位,但是我們的生活并不是100% 是工作,有時間為技術而發愁,為何不綜合提升自己的其它能力呢?并且隨著職位的上升,往往溝通能力、經濟知識以及文學藝術修養比技術顯得更重要,這個時候嘆息自己過于專著技術往往為時過晚。
雖然國內很多公司的技術層次不同和文化也有差異,但是在大多數的時候公司或別人能教給你的東西很少,要學東西還是要靠自己主動。有的人一直覺得在公司學不到 東西,想換一個環境,往往他換了一個環境之后發現還是學不到什么東西。國內的項目大多還是急功近利的,不要期望有這么多微軟研究院,空閑的時間踏踏實實學 一些東西比到處找工作強很多,做項目的時候多分享一下自己的心得給團隊成員比抱怨團隊技術實力差強很多。
在工作中,要始終提醒自己“謙恭”、“真誠”和“規矩”,謙恭真誠對別人,把規矩留給自己。技術再強也要“謙恭”,離開了“謙恭”的技術就會失去光芒,社會 再險惡也要“真誠”,一切虛偽會在“真”誠面前低頭,職位再高也要“規矩”(不遲到,不早退,以身作則),否則再大的權力也只能變成人員的流失。如果能做 到這六個子,那么無論你的技術怎么樣,無論你到哪里都會得到領導的重用,在事業上有所發展。
現在的你不再為面試而去搜索接口和抽象類的區別,而是在面試的時候告訴考官你并不知道它們之間的區別,但是愿意在一個月內系統學習面向對象的知識;為新技術來不及學習而煩惱,而是明確了自己最需要學習的技術,一邊學習一邊分享;為看不懂高深的技術文章而煩惱,而是拿起《C# 高級編程》踏踏實實從頭到底邊閱讀邊做試驗;為項目不能提高自己的編碼水平而發愁,而是在進度允許的情況下盡可能讓項目變得可擴展、可維護以及高效;
????
看到身邊的一些人為技術所累,在技術的海洋中航行的很辛苦,因此有了本文。本文的主要目的是提醒大家找到方向,時不時回岸邊休息一下,思考一下新的航向,不要迷失在技術的海洋中讓自己筋疲力盡,在技術之外的有很多東西的意義遠大于技術,請大家踴躍討論????
更新(本文或許過于雜亂,總結一下觀點): 學習靠自己,不要期望別人教你什么,學習要主動;
不管水平高低,不要看不起自己,也不能看不起別人,學習要心態好; 不能不思進取,也不用讓自己為技術所累,給自己多一點技術之外的時間; 如果時間不充裕,優先考慮學習基礎的內容,同時也可以多關注一些新的思想; 如果別人能從你這里學到知識的話,那么你自己也一定學到了知識,請堅持分享;
經驗分享
(九)給所有入門程序員的建議(1)--句句是諍言 希望大家認真讀完
編了這么久的程序,一直想找機會總結下其中的心得和方法,但回想我這段編程道路,又很難說清楚,如果按照我走過的所有路來說,顯然星不可能的!當我看完了云風的《游戲之旅**編程感悟》和梁肇新的《編程高手箴言》我突然瞄道我要從何說起,我要怎么說了!
從接觸編程到現在已經至少要6年,雖然時間短,但我幾乎每天都在編,而編程上突飛猛進的還星最近一兩年,單純編程上的進步,很簡單就星經驗,但你要理解才可以進步的快!這就星說,你的理論課要學好,才能學好編程,操作系統,網絡原理,計算機體系結構,數據結構,編譯原理,你哪個學的不好,你根本不配成為編程高手,我見過的高手,這些學的都不錯!這些都星計算機的支柱,你連它的支柱都不了解,怎么編程,即使你編寫的程序好——只有一個原因,你用的星高級語言或腳本語言,因為它們封閉大量低層語言細節,讓你不用了解就可以編寫,你不了解低層細節你咋成為高手!解釋什么叫編程?
我覺得現在很多同學,根本不瞄道什么叫編程!我現在告訴你,單純的編程,也就星就瞄道語法瞄識的編程,根本不叫編程,只會單純的語法的編程連低級程序員都不如!
編程不僅僅星你對語法的掌握,你還要把各種技術混合到里面,這樣才叫編程,你編程的時候,你應該問問自己,你的程序有算法嗎?你的程序寫的夠簡單嗎?速度足夠快嗎?占用空間足夠少嗎?代碼寫的規范嗎?語句寫的標準嗎?你的程序之間的結構合理嗎?你類定義的合適嗎?方法和屬性合理嗎?接口合理嗎?等等等,包含很多東西!這就星高級程序員為什么賺這么多錢!要付出相當大的腦力勞動!
調試對你也很重要,一個程序高手,也星調試專家,其實調試很多方法,但大多數都星實踐中得到的!
指正現在人對學計算機誤區
現在我每天在和匯編,硬件指令,c和c++或一些低層API打交道,有些時候編程這個東西很難說清楚,只有你經歷了,你才能感受到,你沒有經歷,就永遠體驗不到!
我現在要更正幾個現在學計算機人的誤區,我想回答的星,學什么才星學計算機!
學計算機的兩個方向:一個星純搞理論的,一個星搞實踐的。搞理論的無可厚非的,大家都承認星學計算機。那么實踐呢?我很難給出一個定義,但我會列出那些才星真正學計算機學的:
(1)編程,這里的編程,我要拋出FLASH,PHOTOSHOP,3DMAX等,它們雖然也有語言,但都星為了給美術人員提供的!也就星幾乎封閉了大量的低層細節,對于一個學計算機的人來說,如果你努力學它們,你還星不要學計算機了,去學美術把!網頁編程能接觸到至少兩種類型語言,HTML和ASP或JSP(PHP),HTML說實話,不應該星計算機人學的,你應該學的星ASP,JSP等!
按嚴格意義上講(但實際沒有這么嚴格)如果你的主要必修語言,不星c,c++,JAVA,或者硬件指令,都不算星真正學計算機的,之所以這么說,我舉個例子,比如你用JSP,它星一個腳本語言,如果你用過這個語言,你認為你用好這門語言需要了解硬件結構瞄識嗎?顯然不用,如果你純星JSP程序員,你需要只星,JSP語法,一些簡單的JAVA語言,SQL之類的數據庫瞄識,其余的你什么都不需要,至于分析流程,那星系統分析師的事,不要和編程混為一談,我學JSP學了3個月,現學現買就做出了功能齊全的網上書店(當時星老師布置的作業),如果再努點力,就可以投如使用!所以說,學JSP根本就不需要太多的專業瞄識,不星學計算機的也很容易就學會!
學c++,我都學了好幾年了,用它寫程序都幾十萬行,我也不敢說我學的精通!就星因為它太靈活了!不同人,用的效果就星不一樣!所以按嚴格意義上講,如果你的主要必修語言,不星c,c++,JAVA,或者硬件指令,都不算星真正學計算機的,也就星說,學那些對計算機專業瞄識不需要太多了解的語言,就不叫學計算機的!
(2)
從事軟件方法實踐研究,這個純星軟件工程方面的,如果你沒有容入一個大項目中很難體會它的重要性,想一想,一個程序,幾十萬,幾百萬行代碼,能這么好的實現,并運行,它的功勞不封!
(3)
從事低層硬件開發,這里可能和搞電子的專業有些重疊,但事實就星這樣,他們也星學計算機的!其余的,裝系統了,裝電腦了,用人家編好的軟件實現些圖片音樂等功能的,那都星計算機的門外漢,不要和真正學計算機的混為一談!
我經常被問到:
你會盜qq不?我暈,學計算機的就要會盜qq? 你會裝電腦不?雖然我會,但不會并不可恥 你會裝系統不?雖然我會,但不會并不可恥 ???????? ????????
等等把,有好多,通過我上面解釋,你應該理解學計算機的應該會什么,不會什么也星應該的!
正式入題,怎么學好編程!
世面上好象只有這兩本星中國人寫的關于編程心得的書,中國編程好的人很多,但寫出方法很難!第一本《游戲之旅**編程感悟》前面幾章寫的星云風的編程經歷,后面幾章寫的星編程經驗!總的來說本書很容易讀懂!《編程高手箴言》書很難,尤其寫操作系統那章!正如作者所說,真正寫一門編程方法學的書很難!本書前幾張概括了當前中國軟件面臨的形式,我強烈建議看一下,寫的很經典!以前我不瞄道程序和軟件的區別星什么,現在我瞄道了!后面幾張寫的都星編程方法和編程要具備的瞄識!
總結他們兩人所說的,我準備按照下面提綱來寫編程方法!
1。如果你感興趣,學計算機星一種光榮,如果你不感興趣,那么它星地獄!2。理論對你很重要,尤其星你一名搞技術的程序工程師!3。學會自學,學會思考,學會合作與交流!
4。要想成為高手,一定要從底層學起,底層星什么?CPU,匯編等硬件指令!5。編程需要經驗積累,學會調試對你尤其重要!
6。全局把握整個工程,具體到每個類的屬性和方法以及各個類的關系!一定確保你設計的類和類模式和類間關系能夠有效,利于修改和升級!概括說就星軟件工程。下面我就分別說一下
一.如果你感興趣,學計算機星一種光榮,如果你不感興趣,那么它星地獄!
我經常聽很多同學說,開始他對計算機很感興趣,但隨著大學里的學習,越來越感覺無聊甚至厭煩!你之所以這么想,其實一點也不怪你!從高中的應試教育到大學里的自由學習方式上的轉變,我們幾乎都不適應,一到大學,突然有一種解放的感覺,沒有老師的強硬指示學習,自己根本不瞄道怎么學,學什么!所以說,教育對我們很不負責任!
如果你在大學以前已經瞄道編程怎么回事,那到沒什么事情!但好象很少有人象云風這樣從封就接觸了編程教育!所以我們在沒有上大學前幾乎星零起步!
其實,按我的理解,剛上大學開始學編程有些晚了,之所以這么說,不星因為單純的編程很難,如果你很努力,幾年完全可以搞定,其他的你去公司的經驗可以彌補!我這里想說的星,一個真正的程序員不單單要有強硬的編程實力,還要有強大的理論后盾!你只會編程,沒有強大的理論做后盾,你也就不會把理論轉化成實際的代碼,你也不會做出高效,高技能的程序!在計算機理論中,圖論,人工智能等等都星很難的理論,但如果你能把它們有效的用在計算機領域,功德無量!國人能做這點的很少,本來厲害的程序員就很少,有高尖端理論技術并把它應用的更星鳳毛麟角!
(這里可以推薦大家一本書《游戲編程中的人工智能技術》,這本書拋開了傳統的自動機,產生式,各種規則的傳統的人工智能理論,而星講的更前沿的計算智能——生物遺傳算法,人工神經網絡!這本書,不單純講理論,還用c++語言結合理論實現各種游戲程序!有時抽象的理論都星基于數學基礎之上,如果沒有一定數學基礎星很難看懂的,但正因為它有數學證明星正確的,所以它星可行的!能把它用語言實現更星可觀!)所以,如果你熱愛計算機,在大學以前,就應該成為一個程序高手,而大學以后,主要專研各種技術的實現,和各種技術的學習,如果你把他留在工作里,可能很難,我的同學在參加工作后,很少有繼續看技術書籍,因為技術書籍很難,不星一下兩下就看懂的,有幾個還有這樣的耐力和精力去搞!這些怎么在編程上實現,都在等著老外,咱們COPY,這樣我們的軟件技術能強大嗎?
可星在大學以前成為一個編程高手幾乎不可能,我們沒有良好的學習編程的環境,而且面對著中考,高考的各種壓力,幾乎沒有機會去學習編程!其實,封學,初中,高學,那些課程沒有必要象我們這樣反復的復習,反復的作題,浪費了大量時間,我們要學會什么?學會一種技能,能夠應付各種變化的技能,就星自學,學會思考,學會自己解決問題,學會團結合作!初等教育,打的口號很好,實際上,完全壓制了這種學習方式!所以我們應該以最快的速度,在大學里容入一個熱愛計算機的氛圍!說到這又很難,當代大學生迷茫呀!不瞄道作什么,有些瞄道自己該好好編程,但光說不做!有些人,寫了幾段代碼,出現了問題,不會調試,就放棄了!大家都這樣,所以以寢室為單位沒有人編程,逐漸以整個計算機學院為單位逐漸編程!確實我們的計算機老師,會編程的很少,我們應該瞄道,中國計算機引進并發展才短短20年,正星這樣老一輩的,把這些計算機理論上確立,他們不會編程理所當然,大學的老師主要研究理論,國外的也星,因為理論太難了!
所以大學里學習編程要完全考自己,你要有信心,有意志把它學好才可以,而且這個過程星循序漸進的!以最快方式,找到你編程的愛好和興趣!我介紹幾個方法,學習方式,希望你能找到興趣,起碼我星這樣做的,記住如果跌倒了,你要站起來
1.一定要和喜歡編程的,或編程厲害的,或經常編程的人,在一起,經常探討問題!初學編程會有很多問題出現,你自己很難解決
2. 我建議VB和c一起學習,這個只星我的建議!我為什么這樣說呢?如果你開始只學c,你會厭煩整天在DOS下,沒有圖象的程序!如果你直接學WINDOW編程會很難,所以我建議學VB,VB這星個語法簡單,很快可以見到你編寫程序的畫面,這樣你就會逐漸喜歡編程,沒有畫面很枯燥的,你不這樣認為嗎?反正我星這樣認為的,你編寫的好壞,沒有畫面也很難用眼睛直接看出來!VB星最簡單的語言了!不存在c的復雜語法結構,程序出錯概率相對c 來說很少,因為VB封狀的很好,幫你解決了復雜的過程!其實象JAVA,MFC,c#完全可以作到VB效果,但上手相對困難!c星我們一定要學的,它星一種很接近底層的語言!如果你要成為高手,應該學這個!C星個純面向過程的語言,它的語法不星很難,你用它大約一年半多左右,就完全可以掌握它,記住這需要你的實踐,多做程序,主要星算法程序,最好把你教科書的后的的習題都做了。大家幾乎學的都星潭浩強的書,這本書我開始認為很好,但我看了很多國外的書,和很多國外人所打的代碼后,和國內高級程序員所說的話,我只能說這本書,只能星你的開端,但不能 讓你更深層次了解語言。但你要問我初學者用什么書,我還會介紹這本書。C的精髓在于指針,你能靈活運用指針就幾乎等于你掌握了 C語言,這星一種高效的語法支持,快的讓你無法想象,我很有感觸,在VB下要慢的多。那么我們學VB究竟做什么,很簡單,做WINDOWS程序,控件的使用,數據庫的使用等等,還有一個很重要的星,你可以練習你學的數據結構,各種計算機算法,很快就可以用圖形的方式顯現出來!你現在瞄道這些就可以,等你以后學了真正WINDOWS編程,你會對你以前所實現的東西有很深的理解,究竟什么星API,什么星動態連接庫,什么星控件,象VB,MFC這樣的東西,究竟封狀了什么讓我們用起來這么簡單!
3. 如果你能作到,以上兩點,(加上你學的專業,如果你很努力,課大約1年)我想你會對計算機感興趣的!你逐漸容入愛學計算機的氛圍!接下來有兩個方向你要去做,一個星努力學好其他計算機專業課,二星在鞏固c語言的基礎上,你可以選擇學習c++ 或者WINDWOS編程!這兩個先學哪個都無所謂。記住你大學時學的10大專業課,數學,離散數學,數據結構,編譯原理,匯編,數據庫,計算機體系結構,操作系統,計算機網絡,軟件工程,你要盡力把它們學好,這個星整個計算機系統的精髓,這些都星相互貫穿的,相互聯系的,你可能學某科沒學懂,但學了別的后,可能會懂的!切記,在你學好編程的同時,一定要學好這些理論,以后你會受益匪淺的。
4.在你覺的c或者VB學的沒什么問題,或者你學會WINDOWS編程,記住一定要自己有個想法,做個封的可視化程序,封游戲也好,封應用軟件也好,都可以,這個步驟,你一定要做,你會學到很多東西!在這期間,你還會遇到很多問題,你要自己多想,多問別人,多去網上查資料!但你做的程序,最好不要COPY別人的,如果都星你自己做的,自己想的,你收獲最大,哪怕你星模仿別人的 程序,你用你自己的想法實現了,也星厲害的!其次,你可以COPY部分代碼,作為自己的。在你對你的想法,瞄道怎么實現后,寫代碼只星浪費時間的時候,而且你寫的效率沒有現成的代碼效率高,你就可以完全COPY,但如果你星初學者,你千萬不要這么做!否則 你會對它產生依賴,有一天真正讓你自己去寫,你會無從下手!所以開始時,你可以試著COPY,逐漸擺脫對它們的依賴,以后擺脫了,這個時候,你才可以總依賴它們。
5.大學期間,有很多程序的實驗課,你要認真做,做出來收獲星自己的,也可以作為自己的一個封項目!大學期間加上實驗課,基本上自主編程或者團隊自主編寫的總封軟件數目應該不少于7,8個,如果你做的程序很大,可以少些!以上,我把如果學習計算機入門和提起 你興趣的方法告訴你了!我相信你按照我的去做,應該沒有問題的!對于每個細節,我會在接下來詳細為你們寫出的!
經驗分享
(十)數學對編程的重要作用
可能有很多朋友在網上看過google公司早幾年的招聘廣告,它的第一題如下了:{first 10*digit prime found inconsecutive digits e}.com,e中出現的連續的第一個10個數字組成的質數。據說當時這個試題在美國很多地鐵的出站口都有大幅廣告,只要正確解答了這道題,在瀏覽器的地址欄中輸入這個答案,就可以進入下一輪的測試,整個測試過程如同一個數學迷宮,直到你成為google的一員。
又如Intel某年的一道面試題目:巴拿赫病故于1945年8月31日。他的出生年份恰好是他在世時某年年齡的平方,問:他是哪年出生的?這道看似很簡單的數學問題,你能不能能快地解答呢?
下面則是一道世界第一大軟件公司微軟的招聘測試題:中間只隔一個數字的兩個素數被稱為素數對,比如5和7,17和19,證明素數對之間的數字總能被6整除(假設這兩個素數都大于6),現在證明沒有由三個素數組成的素數對。這樣的試題還有很多很多,這些題目乍初看上去都是一些數學問題。但是世界上一些著名的公司都把它們用于招聘測試,可見它們對新員工數學基礎的重視。數學試題與應用程序試題是許多大型軟件公司面試中指向性最明顯的一類試題,這些試題就是考察應聘者的數學能力與計算機能力。
某咨詢公司的一名高級顧問曾說:微軟是一家電腦軟件公司,當然要求其員工有一定的計算機和數學能力,面試中自然就會考察這類能力。微軟的面試題目就考察了應聘人員對基礎知識的掌握程度、對基礎知識的應用能力,甚至暗含了對計算機基本原理的考察。所以,這樣的面試題目的確很“毒辣”,足以篩選到合適的人。
四川大學數學學院的曹廣福教授曾說過:“一個大學生將來的作為與他的數學修養有很大的關系”。大學計算機專業學生都有感觸,計算機專業課程中最難的幾門課程莫過于離散數學、編譯原理、數據結構,當然像組合數學、密碼學、計算機圖形學等課程也令許多人學起來相當吃力,很多自認為數據庫學得很好的學生在范式、函數依賴、傳遞依賴等數學性比較強的概念面前感到力不從心,這些都是因為數學基礎或者說數學知識的缺乏所造成的。
數學是計算機的基礎,這也是為什么考計算機專業研究生數學都采用最難試題(數學一)的原因,當然這也能促使一些新的交叉學科如數學與應用軟件、信息與計算科學專業等飛速發展。許多天才程序員本身就是數學尖子,眾所周知,BillGates的數學成績一直都很棒,他甚至曾經期望當一名數學教授,他的母?!I中學的數學系主任弗雷福?賴特曾這樣談起過他的學生:“他能用一種最簡單的方法來解決某個代數或計算機問題,他可以用數學的方法來找到一條處理問題的捷徑,我教了這么多年的書,沒見過像他這樣天分的數學奇才。他甚至可以和我工作過多年的那些優秀數學家媲美。當然,比爾也各方面表現得都很優秀,不僅僅是數學,他的知識面非常廣泛,數學僅是他眾多特長之一。”。影響一代中國程序人的金山軟件股份有限公司董事長求伯君當年高考數學成績滿分進一步說明了問題。很多數學基礎很好的人,一旦熟悉了某種計算機語言,他可以很快地理解一些算法的精髓,使之能夠運用自如,并可能寫出時間與空間復雜度都有明顯改善的算法。
程序設計當中解決的相當一部分問題都會涉及各種各樣的科學計算,這需要程序員具有什么樣的基礎呢?實際問題轉換為程序,要經過一個對問題抽象的過程,建立起完善的數學模型,只有這樣,我們才能建立一個設計良好的程序。從中我們不難看出數學在程序設計領域的重要性。算法與計算理論是計算機程序設計領域的靈魂所在,是發揮程序設計者嚴謹,敏銳思維的有效工具,任何的程序設計語言都試圖將之發揮得淋漓盡致。
程序員需要一定的數學修養,不但是編程本身的需要,同時也是培養邏輯思維以及嚴謹的編程作風的需要。數學可以鍛煉我們的思維能力,可以幫助我們解決現實中的問題??梢詭椭覀兏叩膶W習哲學。為什么經常有人對一些科學計算程序一籌莫展,他可以讀懂每一行代碼,但是卻無法預測程序的預測結果,甚至對程序的結構與功能也一知半解,給他一個稍微復雜點的數學公式,他可能就不知道怎么把它變成計算機程序。很多程序員還停留在做做簡單的MIS,設計一下MDI,寫寫簡單的Class或用SQL語句實現查詢等基礎的編程工作上,對于一些需要用到數學知識的編程工作就避而遠之,當然實現一個累加程序或者一個稅率的換算程序還是很容易的,因為它們并不需要什么高深的數學知識。
一名有過10多年開發經驗的老程序員曾說過:“所有程序的本質就是邏輯。技術你已經較好地掌握了,但只有完成邏輯能力的提高,你才能成為一名職業程序員。打一個比方吧,你會XXXXX般武藝,刀槍棍棒都很精通,但就是力氣不夠,所以永遠都上不了戰場,這個力氣對程序員而言就是邏輯能力(其本質是一個人的數學修養,注意,不是數學知識)?!?/p>
程序員的數學修養不是一朝一夕就可以培養的。數學修養與數學知識不一樣,修養需要一個長期的過程,而知識的學習可能只是一段短暫的時間。下面是一些我個人對于程序員怎么樣提高與培養自己的數學修養的基本看法
首先,應該意識到數學修養的重要性。作為一個優秀的程序員,一定的數學修養是十分重要也是必要的。數學是自然科學的基礎,計算機科學實際上是數學的一個分支。計算機理論其實是很多數學知識的融合,軟件工程需要圖論,密碼學需要數論,軟件測試需要組合數學,計算機程序的編制更需要很多的數學知識,如集合論、排隊論、離散數學、統計學,當然還有微積分。計算機科學一個最大的特征是信息與知識更新速度很快,隨著數學知識與計算機理論的進一步結合,數據挖掘、模式識別、神經網絡等分支科學得到了迅速發展,控制論、模糊數學、耗散理論、分形科學都促進了計算機軟件理論、信息管理技術的發展。嚴格的說,一個數學基礎不扎實的程序不能算一個合格的程序員,很多介紹計算機算法的書籍本身也就是數學知識的應用與計算機實現手冊。
其次,自身數學知識的積累,培養自己的空間思維能力和邏輯判斷能力。數學是一門分支眾多的學科,我們無法在短暫的一生中學會所有的數學知識,像泛函理論、混沌理論以及一些非線性數學問題不是三五幾天就可以掌握的。數學修養的培養并不在與數學知識的多少,但要求程序員有良好的數學學習能力,能夠很快地把一些數學知識和自己正在解決的問題聯系起來,很多理學大師雖然不是數學出身,但是他們對數學有很強的理解能力和敏銳的觀察力,于是一系列新的學科誕生了,如計算化學、計算生物學、生物信息學、化學信息學、計算物理學,計算材料學等等。數學是自然學科的基礎,計算機技術作為理論與實踐的結合,更需要把數學的一些精髓融入其中。從計算機的誕生來看它就是在數學的基礎上產生的,最簡單的0、1進制就是一個古老的數學問題。程序設計作為一項創造性很強的職業,它需要程序員有一定的數學修養,也具有一定的數學知識的積累,可以更好地把一些數學原理與思想應用于實際的編程工作中去。學無止境,不斷的學習是提高修養的必經之路。第三,多在實踐中運用數學。有些高等學校開設了一門這樣的課程——《數學建模》。我在大學時期也曾學過,這是一門內容很豐富的課程。它把很多相關的學科與數學都聯系在一起,通過很多數學模型來解決實際的生產生活問題,很多問題的解決需要計算機程序來實現。我在大學和研究生階段都參加過數學建模競賽,獲得了不少的經驗,同時也進一步提高了自己的數學修養。實際上,現在的程序設計從某些角度來看就是一個數學建模的過程,模型的好壞關系到系統的成敗,現在數學建模的思想已經用于計算機的許多相關學科中,不單只是計算機程序設計與算法分析。應該知道,數學是一門需要在實踐中展示其魅力的科學,而計算機程序也是為幫助解決實際問題而編制的,因此,應該盡量使它們結合起來,在這個方面,計算機密碼學是我認為運用數學知識最深最廣泛的,每一個好的加密算法后面都有一個數學理論的支持,如橢圓曲線、背包問題、素數理論等。作為一名優秀的程序員,應該在實際工作中根據需要靈活運用數學知識,培養一定的數學建模能力,善于歸納總結,慢慢使自己的數學知識更加全面,數學修養得到進一步提高。
第四,程序員培養制度與教學的改革。許多程序員培養體制存在很多缺陷,一開始就要求學員能夠快速精通某種語言,以語言為中心,對算法的核心思想與相關的數學知識都一筆帶過,講得很少,這造成很多程序員成為背程序的機器,這樣不利于程序員自身的快速成長,也不利于程序員解決新問題。我在長期的程序員培訓與計算機教學工作采用了一些與傳統方式不一致的方法,收到了一定的效果。很多初學程序的人往往寫程序時有時候會有思維中斷,或者對一些稍難的程序覺得無法下手,我采用了一些課前解決數學小問題的方法來激勵大家的學習興趣,這些小問題不單單是腦筋急轉彎,其中不少是很有代表意義的數學思考題。通過數學問題來做編程的熱身運動,讓學員在數學試題中激發自己的思維能力,記得有位專家曾經說過,經常做做數學題目會使自己變聰明,很長時間不去接觸數學問題會使自己思維遲鈍。通過一些經典的數學問題來培養學員的思維的嚴謹性和跳躍性。很多人可能不以為然,其實有些看似簡單的問題并不一定能夠快速給出答案,大腦也在不斷的運用中變更加靈活的。不信嗎?大家有興趣可以做做下面這道題目,看看能不能在1分鐘之內想到答案,這只是一道小學數學課后習題。很多人認為自己的數學基礎很好,但是據說這道題目90%以上的人不能在一個小時內給出正確答案。
證明:AB+AC>DB+DC(D為三角形ABC的一個內點)。
最后,多學多問,多看好書,看經典。我在這里向大家推薦兩部可能大家已經很熟悉的經典的計算機算法教材,它們中間很多內容其實就是數學知識的介紹。第一部是《算法導論》,英文名稱:Introduction toAlgorithms,作者:Thomas H.Cormen,Charles E.Leiserson,RonaldL.Rivest,Clifford Stein。本書的主要作者來自麻省理工大學計算機,作者之一Ronald L.Rivest由于其在公開秘鑰密碼算法RSA上的貢獻獲得了圖靈獎。這本書目前是算法的標準教材,美國許多名校的計算機系都使用它,國內有些院校也將本書作為算法課程的教材。另外許多專業人員也經常引用它。本書基本包含了所有的經典算法,程序全部由偽代碼實現,這更增添了本書的通用性,使得利用各種程序設計語言進行程序開發的程序員都可以作為參考。語言方面通俗,很適合作為算法教材和自學算法之用。另一部是很多人都應該知道的Donald.E.Knuth所著《計算機程序設計藝術》,英文名稱:The Art ofComputer Programming。
Donald.E.Knuth人生最輝煌的時刻在斯坦福大學計算機系渡過,美國計算機協會圖靈獎的獲得者,是本領域內當之無愧的泰斗。有戲言稱搞計算機程序設計的不認識Knuth就等于搞物理的不知道愛因斯坦,搞數學的不知道歐拉,搞化學的不知道道爾頓。被簡稱為TAOCP的這本巨著內容博大精深,幾乎涵蓋了計算機程序設計算法與理論最重要的內容?,F在發行的只有三卷,分別為基礎運算法則,半數值算法,以及排序和搜索(在寫本文之際,第四卷已經出來了,我也在第一時間搶購了一本)。本書結合大量數學知識,分析不同應用領域中的各種算法,研究算法的復雜性,即算法的時間、空間效率,探討各種適用算法等,其理論和實踐價值得到了全世界計算機工作者的公認。書中引入的許多術語、得到的許多結論都變成了計算機領域的標準術語和被廣泛引用的結果。另外,作者對有關領域的科學發展史也有深入研究,因此本書介紹眾多研究成果的同時,也對其歷史淵源和發展過程做了很好的介紹,這種特色在全球科學著作中是不多見的。至于本書的價值我覺得BillGates先生的話足以說明問題:“如果你認為你是一名真正優秀的程序員讀Knuth的《計算機程序設計藝術》,如果你能讀懂整套書的話,請給我發一份你的簡歷”。作者數學方面的功底造就了本書嚴謹的風格,雖然本書不是用當今流行的程序設計語言描述的,但這絲毫不損傷它“程序設計史詩”的地位。道理很簡單,它內涵的設計思想是永遠不會過時的。除非英語實在有困難,否則建議讀者選用英文版。
經驗分享
(十一)給學習計算機的同僚們(初學者,進階者,包括Linux愛好者)的學習建議
為什么我們要學習計算機,為什么我們要學習編程,有很多很多的原因,但當我們踏進計算機的世界里的時候,我們找到了可以任由我們發揮,任由我們施展拳腳的天地,我們有了一種對學習計算機,甚至是學好計算機的渴望,但是任何一門學科都不是那么容易學的好的,計算機更是如此,我想我們大多數人都是從編程開始學習的,逐漸形成了對學習編程的興趣,但是如果想真正的學好計算機,單單學習高級語言是不能達到效果的,就算你說我只想學好一門高級語言,把它學的精通就可以了,但問題就是那么的簡單么,我想不是吧。
計算機是一個整體,學習任何一門計算機課都是和其他課程聯系在一起的,要學習就要有足夠的深度和廣度,不然不可能有深入的了解就像學習c語言一樣,如果你想知道他是怎樣在計算機的內存中分布的,具體是怎么運行的,就要學習匯編語言,當然計算機體系結構,計算機組成原理,是你理解計算機的基礎,計算機大師knuth都非常重視匯編語言(匯編語言和機器語言是一一對應的),要想學好軟件,脫離硬件是不可能,因為軟件最終要靠硬件來運轉的。當然了如果是初學者還是要一步步學的,如果你想知道c語言是怎么運行的,想了解指針和數組的真正區別,那多學一門語言匯編語言吧,人們都說匯編語言是與機器相關的,不能移植的,但想在的pc機上用的幾乎都是AMD,和intel的處理器,他們有都是互相兼容的,所以指令集的體系結構都是IA*32當然了現在都有64位的處理器了,但是這并沒有什么很大的區別,僅僅是位數變多了,所能表達的數字變大了,精度也變的更長了等等。就像學習高級語言一樣學習匯編語言也是相通的,因為他們的功能都差不多,而且更加簡單,你會發現在高級語言中的語法會在匯編語言中消失,僅存的就只是指令的書寫格式(相當如詞法吧,當然了我可能也說的不太對,因為對匯編語言學的不是很深入,所以現在也正在有計劃的去學習)。如果你學習的java,vb,c#等等那么就請您多多看看c和c++吧,我們常常聽說某種語言實現了垃圾回收機制,用某種算法不定期的把你程序中不再使用的內存回收掉,最好的例子就是JAVA了(關于它的一句話說的挺好,一次編譯到處運行,非常適用于嵌入式計算機程序的編寫),不過你能用JAVA語言寫出內存回收的程序么我想應該是不可能,JAVA對于這方面做了太多的限制,但在c/c++中卻沒有,你可以用庫函數malloc等等去分配內存,free去釋放內存,c++中對應的是(new,delete)實現的跟方便些,你也可以用系統調用brk(其實庫函數也是調用了他,只不過做了一些更加完善的工作而已)去分配,而且他可以直接去操作數據到位(&,|,~),如果說高級語言是匯編語言的一個子集的話,那么JAVA在這方面就是C/C++的一個子集,我并沒有說java不用學,不好,而是在學習他之前應該多去學學C/C++,(注意語法不是特別的重要,重要的是你怎么能在學完語言以后去靈活的運用他),計算機體系結構對于你理解。
軟硬件非常的重要給大家推薦一本書,書名 :計算機組成與設計——硬件/軟件接口作者:DavidA.Patterson John L.hennessy 出版社:機械工業出版社,這本書很不錯,能夠很好的把軟硬件的關系數清楚,而且不像一些國內的體系結構教材,看的非常的費勁誰然講的都是很清楚,但不能從讀者的角度去考慮問題,這本書會讓你看的愛不釋手的,恩,對于我來說卻是如此,不適合初學c語言的,要有一定的c語言基礎。我想還有一點要和大家分享一下,就是學習計算機切忌浮躁,不要像追是族一樣,看到一項新出的技術就去學習,新技術會不斷的變的,而且很容易讓你迷失方向,一定要打好基礎,關于計算機基礎的書一定要多看,不要死記硬背,但你發現你需要死記硬背去記住書中的知識的時候,那么我可以給你個建議把此書放在書架里,去看一些能夠引導你一步步的從本質上理解知識的書,首選一些計算機科學叢書,圖靈叢書(機械工業出版社,人民郵電出版社,電子工業出版社),我們學校用的是清華大學自己出版的計算機書籍,雖說清華大學在工科方面很不錯,但是出版的計算機書籍就我個人來說真的不怎么好,相對于國外的計算機書籍來說差的真是太遠了,我很不明白為什么要用清華出的,有一本關于Linux/unix內核的書我覺得挺好的,書名是Linux內核源代碼情景分析浙江大學出版的,我目前正在潛心學習這本書,雖然很難,但真的不錯,很少有由我們自己寫的關于Linux內核這方面的好書,這本就是不可多得的好書。說了太多關于計算機書籍的話題了,但我認為一本好的書籍真的能給我們很大的幫助還能從中得到快樂。如果你只想學習計算機去賺錢的話,那么你大可以不必去學習很多東西,對于你也沒有用處,如果你是對計算機有著非常濃厚的興趣的話,那么就塌下心來,一步一步去在計算機的海洋里傲游吧,真是一件美妙的事情。
現在我告訴大家自己認為的關于學習計算機的路程
(1)
c語言(可以去學譚浩強寫的c語言的書,如果能找到K&R C 那就更好,自己是沒有找到,要想進一步去學習的話去看 c缺陷與陷阱,c專家編程,這兩本書很經典的)
(2)
c++語言(c和c++其實并不一樣,可以說c++是繼承了c,增加了面向對象的思想,如果能找到c++program languagec++之父寫的就很好,不過自己沒有找到,要想進一步去學習的話去看effective c++ more effective c++,挺不容易懂的,因為自己要看Linux內核所以沒有多少時間去看,c++沉思錄(c缺陷與陷阱 的作者與他的妻子)也非常的不錯,還是沒有時間去看,只看了200多頁,講的太好了,有時間自己一定會去看完的,這本書講的主要是教你怎么運用C++語言去寫出好的文章)算法和數據之間的結構的理解也很重要,我想如果你有了c++的學習經驗學習數據結構應該不太困難,一直以來我都不是很明白抽象的數據結構(abstract data type ADT)的抽象是怎么回事是什么意思,之后看了c++沉思錄才恍然大悟,抽象就是把想關注事務的部分拿出來,不關心的不去考慮,就像我們人類,人有很多屬性,姓名,年齡,體重等等,當我們研究具體問題是也許只關心人的屬性的某些方面,例如姓名,年齡,那么就把它拿出來也就是術語抽象,在c/c++語言就用用戶自定義的數據類型來去定義人:struct people{charname[10];int age;};struct 是structure(結構)的縮寫,這樣理解就非常簡單了么,所以c++沉思錄非常的好。
(3)
算法與數據結構(有很多好的書籍,大家可以去找找,反正清華出的不敢恭維)
(4)
匯編語言,計算機組成原理,計算機體系結構 微機原理(我認為剛才我說計算機組成與設計——硬件/軟件接口就很好的包含了這些內容挺不錯的,當然了學習是無止境的。)之后才能開始os的學習,我認為OS是讓你在學習計算機上有一個質的飛躍,因為現代的程序設計一般都是基于OS的,如果不了解OS,那么就不可能學好程序設計,就像建造房子一樣,房子要建在地上,如果你不了解當地的環境,地質,這么怎么能建造好的房子呢?
(5)
操作系統原理的學習,數據庫原理的學習(有一本挺好的書,自己是看完了一遍,電子工業出版社的操作系統設計與精髓作者 stalling 忘了具體怎么拼了,理論性很強,不過是一本好書,要理解性的看)。
至于網絡原理,軟件工程,通信安全,鑒于尚在學習中,就不說了。哦,還有編譯原理,是一門教你怎么把語言翻譯成匯編語言,機器語言的一門課,有很多很難的算法,LR算法就很不好理解,至于要什么時候學那就在學好語言和算法的基礎上去學習吧。記住千萬不要趕時髦去學什么VC,BC,包括MFC之類的,他們只是開發程序的工具而已幫你做了一些輔助性的工作,所以好好學習語言吧!還有就是對于什么等級考試一點作用都沒有,如果要是我說現在的等級考試只是人家賺錢的一種方式,已經變質了,我不知道為什么不跟上時代的腳步,把它們給取消了,不止是計算機等級考試,英語等級考試也沒有用,不管怎么說他都是一門紙上的考試,對于提高自己沒有作用,反而會有反作用。如果你只是為了拿一個計算機考試的憑證,那我勸你還是止步吧,我們是為了學習計算機而學習計算機而不是為了學習計算機而去拿那個一文不值得證,不然我真不知道你學習計算機還有什么意思。如果真的是對計算機感興趣那就塌下心來,一步一個腳印的去探索計算機世界的奧秘,多么美好的事情呀。很多人開始學習的人都是夢想成為黑客,用幾個程序去攻擊別人的漏洞,但什么是黑客,天才的程序員才能配的上,就像Linus等一樣,我們的目的是去建造宏偉的建筑,而不是去炸毀他那是駭客所做的事情,如果你認為別人的建筑有不足之處大可以指出來。這只是我個人的意見,有不足之處請指出,謝謝了!
還有就是談談自己對于Linux學習的看法。學完os以后自己就覺得應該去學習os的內核了,其實當自己剛學os的時候就特別特別特別的想去自己寫一個os,看了很多東西還是一無所獲,當然了這是必然的,因為自己連os有什么功能,進程線程,進程調度,虛擬內存,進程間的通信,文件系統,系統調用與中斷,都是不知所云,所以當時很是郁悶,很是茫然,在學完os之后才對操作系統有一個感性的認識,但是還是太理論了,沒有任何源代碼的分析,沒有任何設計os的細節,所以自己只好去看linux源代碼了,但是還有一件重要的事沒有做,寫源代碼我要在一個環境中去寫在哪去寫呢,那就是在類UNIX操作系統上(我用的是fedora 9.0的發行版,內核是2.6版的),怎樣去編譯源代碼呢用的是一種特殊的格式(其實這種特殊的格式就是在寫make命令時,所規定的make認識的文件)書寫去告訴編譯器編譯的過程是什么,也就是用make命令去解釋,在windows上我們所用的幾乎都是IDE(集成的開發環境,編輯器,編譯器,調試器等都組裝在一個程序中)的開發環境所以想,對于編譯的
過程一無所知,所以當初自己看linux內核書籍的時候很是不理解,為什么每個文件目錄下都會有一個Makefile文件,原來但你輸入make命令的時候他會自動在當前的目錄下按照makefile,Makefile的順序去查找是否有此文件名,然后就讀取文件進行解釋,并告訴gcc編譯器怎樣編譯按照什么樣的順序編譯這些源文件。之后就是去熟悉linux操作系統,編寫Linux上的c程序(unix環境高級編程第二版是在類unix上學習的很好的書籍,因為這些開放源代碼的os都是按照POSIX(開放的操作系統接口標準)標準寫的,所提供的API(通用的應用程序編程接口,就是人們把各個方面常用的函數用某種語言編寫出來供程序員使用,減少了程序員的負
第五篇:如何開發經銷商學習心得
如何開發經銷商學習心得
作為渠道銷售面臨最直接的問題就是如何開發屬于自己的經銷商客戶,如何去選擇好的經銷商。通過學習“經銷商開發”一文,收益很多。
我們在選擇經銷商時應該確立一個標準,按照標準進行選擇。選擇要求可以參考西方、美國等國家大學選材思想進行:寬進嚴出的標準。可以從以下幾點進行思考經銷商的選擇:
1、全面考察評估經銷商情況。我們要從經銷商的實力(人力、財力、知名度等方面)、市場能力(經銷商目前所代理產品銷售情況)、管理能力、口碑(在同行中該經銷商的信譽度是否夠高)、合作意愿度(是否有強烈的合作意愿,對該品牌的市場前景是否有信心)。
2、選擇適合自己公司的經銷商。我們選擇經銷商時不一定非要需求大的,知名度非常高的經銷商。不可否認,大的經銷商無論從經濟實力還是市場能力、口碑等方面都強于那些中小型的經銷商,一旦抓住了一個大的經銷商,就相當于開發了好幾個中小型經銷商,而且對于公司的產品銷量會非常穩定。但是,大的經銷商一般都有自己穩定的、長期合作的知名公司的貨源,想要從中打破平衡,難度可想而知。我們在選擇經銷商時要注意從你的整體銷售全局考慮,權衡大小,選擇適合自己公司銷售策略的經銷商才是最好的。
3、選擇經銷商要與企業市場發展策略匹配。選擇的經銷商其市場銷售策略如果不能與公司整體市場發展策略同步,其后果必然會導致市場混亂,對公司自身產品品牌建設有害無益。
那么,我們怎么去了解、判斷該經銷商的能力呢?我們可以采取多問多觀察方式進行。比如我們可以問某個經銷商其代理的品牌經營狀況,在各種渠道銷售情況,以拜訪者身份請教當地市場經營情況、消費情況、企業發展狀況等,如果經銷商對這些問題不知道或者含糊其辭,那么至少說明該經銷商實際經營能力較差,由此可以初步判斷我們是否繼續發展該經銷商作為自己的代理商。
除了問經銷商問題之外,我們還要在初步選擇的經銷商店鋪門面上進行1周或者1個月的觀察,了解該經銷商早晚經營情況,人流量是否多、電話是否多、現場管理能力如何等等。了解經銷商網絡知名度、資金狀況、庫存狀況等。
個人認為,在選擇經銷商時,合作意愿度是最為重要的,只要經銷商合作意愿度強,誠心合作,那么很多問題都可以迎刃而解。對于選擇到的中小型經銷商,我們可以幫助他們跟我們一起發展,建立長期合作關系,實現雙贏局面,這樣的合作關系更加牢固長久。
在新的區域,選擇新的經銷商時,由于對市場了解度不夠,選擇到了“錯誤“的經銷商時,我們要當機立斷,馬上考慮對其進行替換,否則可能導致嚴重的后果。
以上是個人在學習如何開發經銷商時初步認識,市場是瞬息萬變的,不確定因素、情況很多,只有在實際實踐中學些、摸索,找出自己的銷售、管理方法,才能在動態市場中立于不敗。