2018-01-27虞衛(wèi)東51CTO技術(shù)棧
創(chuàng)業(yè)公司招工程師難钾虐,招來水平也參差不齊。在編碼上笋庄,不僅要考慮整體安全效扫、規(guī)范,還要快直砂,實(shí)在不易菌仁。
創(chuàng)業(yè)公司招工程師難,招來水平也參差不齊静暂。在編碼上济丘,不僅要考慮整體安全、規(guī)范洽蛀,還要快摹迷,實(shí)在不易。
本篇為大家介紹創(chuàng)業(yè)型公司在技術(shù)團(tuán)隊(duì)開發(fā)方面的一些觀點(diǎn)郊供,告訴大家如何避免成本浪費(fèi)峡碉,提高時間效率及管理的一些技巧。
對于一個互聯(lián)網(wǎng)創(chuàng)業(yè)公司來說颂碘,有以下這幾個特點(diǎn):
1. 什么都要求快异赫,這個快也許并非來自用戶,而來自于自己头岔,比如恨不得開發(fā)一天就開發(fā)一個新功能塔拳。
2. 變化快,比如一個想法落實(shí)到開發(fā)峡竣,可能會有很多變化靠抑。
3. 資源稀缺性,資源就是時間适掰、金錢和人力成本颂碧,對于創(chuàng)業(yè)公司來說荠列,有效的花費(fèi)資源本身就很重要,看看多少創(chuàng)業(yè)公司都是胡亂花錢而撐不下去的载城,而對應(yīng)的技術(shù)上就是能省則省肌似。
針對以三個主要特點(diǎn),創(chuàng)業(yè)公司在技術(shù)使用的策略上有什么準(zhǔn)則呢诉瓦?
個人認(rèn)為就是“簡單化“川队,當(dāng)然這個簡單是建立在理性分析的基礎(chǔ)上的。技術(shù)人員有個通病睬澡,認(rèn)為技術(shù)實(shí)現(xiàn)越復(fù)雜固额,越膨大,越全面就越能體現(xiàn)技術(shù)水平煞聪。
這是非常錯誤的一個觀點(diǎn)斗躏,衡量技術(shù)水平的唯一標(biāo)準(zhǔn)其實(shí)就是“是否有效支撐業(yè)務(wù)發(fā)展”,要看結(jié)果論昔脯,比如說開發(fā)速度快啄糙,后期問題少,假如能做到這些栅干,那么這個技術(shù)團(tuán)隊(duì)就是牛逼的迈套。
而提倡簡單化的理論,就會讓你從另外一個角度去審視技術(shù)本身碱鳞,下面的一些技術(shù)使用建議也許看上去并不高大上桑李,好像每個人都能明白,但假如能有效的實(shí)行窿给,在創(chuàng)業(yè)初期能夠解決大部分的技術(shù)問題贵白。
一 使用云服務(wù)器
對于創(chuàng)業(yè)團(tuán)隊(duì)來說,并不知道未來用戶有多少崩泡,需要使用多少服務(wù)器資源(Web 服務(wù)器禁荒,DB 服務(wù)器等等)不好衡量。
而云服務(wù)器的可擴(kuò)容性則能很好的滿足這個需求角撞,換句話說創(chuàng)業(yè)初期使用云服務(wù)器可以有效節(jié)省成本呛伴。
云服務(wù)器的特點(diǎn)還不止這么多,它代表了一種開發(fā)模式谒所,即分層架構(gòu)热康。比如云服務(wù)器的類型有很多(云服務(wù)器、云緩存服務(wù)器劣领、云數(shù)據(jù)庫服務(wù)器姐军、云存儲服務(wù)器)。
正因?yàn)橛辛诉@樣的分層模式,讓你有了更好的選擇奕锌,假如自建服務(wù)器著觉,很多技術(shù)團(tuán)隊(duì)可能會把 Web 服務(wù)器和 DB 服務(wù)器放一塊,從而帶來很多問題惊暴。
另外云服務(wù)器也有沙箱功能饼丘,在安全性上也有很好的保證。雖然可能很多人覺得現(xiàn)在云廠商做的不好或不安全缴守,不過說句實(shí)話你自己搞可能更差葬毫。
當(dāng)然使用云服務(wù)器也并不能說明一定就省錢镇辉,這取決于你是是否真正了解系統(tǒng)以及其背后需要的資源屡穗。
二 重視數(shù)據(jù)存儲
先入為主,推薦使用?MySQL來存儲數(shù)據(jù)忽肛。在設(shè)計(jì)上要盡量規(guī)范化村砂,索引利用合理一點(diǎn),因?yàn)閿?shù)據(jù)有個特點(diǎn)屹逛,假如前期設(shè)計(jì)不好础废,后期想重新調(diào)整結(jié)構(gòu)是非常痛苦的一件事情。
原來公司某個產(chǎn)品罕模,最重要的博文數(shù)據(jù)庫表(blog 表)有個字段存儲的是文章的具體內(nèi)容(content 字段)评腺,從而導(dǎo)致這個表非常龐大,查詢性能和內(nèi)容非常不好控制淑掌。
就我了解到的情況是目前 content 字段還是沒有從 blog 表中拆分蒿讥,這不僅僅是技術(shù)的問題,對于一個在線的服務(wù)抛腕,數(shù)據(jù)量很大的服務(wù)芋绸,做表結(jié)構(gòu)的調(diào)整是非常困難的,所以前期盡量設(shè)計(jì)好担敌。
MySQL 主要的作用還是存儲摔敛,雖然可以通過 SQL 完成很多復(fù)雜的查詢,但是建議盡量少使用全封,否則性能會急劇下降马昙。
我?guī)啄昵傲私獾揭粋€爆款的產(chǎn)品,用戶量上來后刹悴,第一個壓垮它的就是數(shù)據(jù)庫行楞,最大的原因就在于查詢非常不合理,做了非常多的聯(lián)合查詢颂跨。
假如不合理使用 MySQL敢伸,很多人會質(zhì)疑性能不行,其實(shí)這都是錯覺恒削,我一直相信的一個原則就是池颈,既然這么多人用尾序,說明必然有它的優(yōu)勢,我們要做的就是學(xué)會使用而不是抱怨躯砰。
對于 MySQL 這樣的數(shù)據(jù)庫每币,很重要的觀點(diǎn)就是備份和安全性,剛工作的時候領(lǐng)導(dǎo)說過這樣一句話琢歇,“代碼可以重構(gòu)兰怠,但是數(shù)據(jù)不能丟,所以在寫操作數(shù)據(jù)程序的時候一定要慎重”李茫,而 MySQL非常成熟揭保,備份和安全性上有很多選擇。
另外一個觀點(diǎn)就是假如你并不知道數(shù)據(jù)量和訪問量是多少魄宏,開始不要選擇分庫分表策略秸侣,也不要搞很多路由策略,盡量簡單點(diǎn)宠互。單表數(shù)據(jù)量在一百萬級別味榛,只要設(shè)計(jì)和使用上保持穩(wěn)健性,性能不是問題予跌。
MySQL 的主輔同步本來是做備份用的搏色,但是現(xiàn)在很多人多當(dāng)分布式查詢使用,也能分擔(dān)很多查詢壓力券册。
現(xiàn)在很多 NoSQL 服務(wù)特別多频轿,比如 Redis ,對于創(chuàng)業(yè)公司來說建議不要使用汁掠,原因有兩點(diǎn):
1. 這些服務(wù)并不完全成熟略吨,在使用上需要有很多經(jīng)驗(yàn),尤其在備份和安全性上考阱,在運(yùn)維上并不簡單翠忠,需要有極大的成本。
2. 雖然它有很多優(yōu)點(diǎn)是數(shù)據(jù)庫比不了的乞榨,但是還是那句話秽之,它能做的 MySQL 也能做。
對于創(chuàng)業(yè)團(tuán)隊(duì)來說吃既,上手簡單和維護(hù)簡單考榨,成本是優(yōu)先要考慮的。當(dāng)然假如應(yīng)用場景非常需要用 NoSQL 這樣的服務(wù)鹦倚,還是要大膽的使用河质。
三 統(tǒng)一開發(fā)框架
開發(fā)框架在我看來有兩個最主要的作用,分別是規(guī)范和最佳實(shí)踐。
所謂規(guī)范就是框架定義了一些制度掀鹅,框架理論上不應(yīng)該讓你隨意寫代碼散休,尤其在 PHP 語言中,由于太靈活了乐尊,假如沒有一套框架去制約開發(fā)者戚丸,那么寫出來的系統(tǒng)會很脆弱。
最佳實(shí)踐就是框架集成了很多優(yōu)秀的思想和功能扔嵌,要做的就是去合適的用限府,框架能夠解決分層的問題,能夠解決安全性的問題痢缎。
創(chuàng)業(yè)團(tuán)隊(duì)一定要有一套開發(fā)框架胁勺,但是在選擇上必須謹(jǐn)慎,不要選擇太難以理解的框架牺弄。
比如說 PHP 框架 Laravel 姻几,對于使用者來說需要具備很強(qiáng)的設(shè)計(jì)模式和 OOP 理解能力,沒有經(jīng)驗(yàn)就選擇簡單易學(xué)的框架势告。
第二個選擇框架不要選擇封裝太多的框架,舉 JQuery 的例子抚恒,很多人可能會 JQuery 但不會 JavaScript咱台,所以選框架應(yīng)該選用接近開發(fā)語言本質(zhì)的框架。
另外框架沒有絕對的好壞俭驮,一個創(chuàng)業(yè)團(tuán)隊(duì)能夠快速上手的框架就是好框架回溺,使用框架 20% 的功能即可,開發(fā)人員喜歡過度的使用軟件混萝。
說到開發(fā)框架遗遵,不要強(qiáng)迫開發(fā)人員使用統(tǒng)一的 IED,只要最終代碼輸出標(biāo)準(zhǔn)一樣即可(比如 PHP 語言重點(diǎn)符合 PSR-2 即可)逸嘀。
四 使用 Cache 并配合 Cache 管理工具
在互聯(lián)網(wǎng)產(chǎn)品中车要,可以說 Cache 為王,很多人不管三七二十一必須要使用 Cache崭倘。
可我個人覺得系統(tǒng)假如沒有瓶頸(這個詞需要好好理解)翼岁,不一定需要使用 Cache,首先有容量資源成本司光,另外也會增加系統(tǒng)的復(fù)雜度琅坡,導(dǎo)致開發(fā)維護(hù)成本提高。
假如實(shí)在需要使用 Cache残家,一定要充分理解應(yīng)用場景榆俺,是 pull 式的 Cache,還是 push 式的 Cache ,如何衡量 Cache 的效果茴晋。
假如必須要使用 Cache 迂求,一定要有一個 Cache 管理器,什么意思呢晃跺?對于技術(shù)人員來說揩局,代碼在寫的時候,意識不到 Cache 的存在掀虎,全部優(yōu)雅的封裝了凌盯,而封裝能帶來開發(fā)和維護(hù)成本的減低。
最重要的一點(diǎn)就是不要過度追求命中率這一指標(biāo)烹玉,從而把代碼搞的非常復(fù)雜驰怎。
比如使用 Memcached,可以基于 SQL 查詢語句做 Cache 二打,多采用 pull 的方式县忌,過期時間可以設(shè)置短一點(diǎn)(意思就是不要主動的去更新 Cache)。
另外一種使用方式就是將數(shù)據(jù)庫的聯(lián)合查詢的結(jié)果主動放入到 Cache 中继效。
五 盡量異步化
異步化是一種開發(fā)策略症杏,對于創(chuàng)業(yè)團(tuán)隊(duì)的產(chǎn)品來說,資源有限的情況下瑞信,沒有必要每個功能追求及時響應(yīng)厉颤。
比如說現(xiàn)在很多 SNS 社交產(chǎn)品,沒有必要評論數(shù)凡简、點(diǎn)贊數(shù)及時更新逼友,排行榜也不用及時更新,假如什么功能和需求都要做到極致秤涩,對于開發(fā)和時間是極大的挑戰(zhàn)帜乞。
所以對于創(chuàng)業(yè)團(tuán)隊(duì)來說,請有效使用異步化筐眷。舉幾個例子:
比如說用戶點(diǎn)贊黎烈,沒有必要程序?qū)崟r響應(yīng)這個用戶有沒有點(diǎn)贊,直接將這個請求放入隊(duì)列浊竟,這樣這個接口的響應(yīng)和吞吐能力就提升了怨喘。
每天文章訪問的排行榜,沒必要查詢數(shù)據(jù)庫振定,每天或者每個設(shè)定的間隔時間從數(shù)據(jù)庫中查詢出結(jié)果放入緩存即可必怜,會減少很多數(shù)據(jù)庫的查詢。
六 日志系統(tǒng)
在互聯(lián)網(wǎng)應(yīng)用中后频,日志無處不在梳庆,如操作系統(tǒng)運(yùn)行的日志暖途,服務(wù)器日志,軟件的運(yùn)行日志膏执,數(shù)據(jù)庫操作的日志驻售,應(yīng)用程序日志,產(chǎn)品業(yè)務(wù)日志更米。
這些日志是了解服務(wù)運(yùn)行狀況的最好的來源欺栗,在創(chuàng)業(yè)團(tuán)隊(duì),最忌諱系統(tǒng)出了問題不知道如何分析問題征峦,產(chǎn)品人員需要一些數(shù)據(jù)卻拿不出迟几,系統(tǒng)的歷史運(yùn)行狀況也完全一摸黑。
所以對于創(chuàng)業(yè)團(tuán)隊(duì)來說栏笆,一定要重視日志类腮。對于開發(fā)人員來說,在開發(fā)框架中一般都有日志模塊蛉加,良好的定義好日志格式和含義蚜枢。
假如服務(wù)器眾多,可以使用一些分布式日志系統(tǒng)來搜集和壓縮日志针饥,其實(shí) Linux 發(fā)行版自帶的 Syslog 其實(shí)是非常好的一款軟件厂抽。
這樣從側(cè)面說明我們不用尋找多少高大上的軟件,用好操作系統(tǒng)自帶的工具就很不錯了打厘。
七 監(jiān)控系統(tǒng)
有了日志修肠,下個話題就是監(jiān)控,因?yàn)楸O(jiān)控都是基于日志的分析户盯,確定合適的閥值,選擇是否報警饲化,所以對于技術(shù)團(tuán)隊(duì)來說莽鸭,有了日志就要充分的分析。
而一套完善的監(jiān)控系統(tǒng)很重要吃靠,能夠?qū)ο到y(tǒng)的運(yùn)行狀況有更好的了解硫眨,主動的去發(fā)現(xiàn)問題,而不是等待用戶去投訴巢块。
監(jiān)控的維度可以有很多礁阁,比如系統(tǒng)慢查詢?nèi)罩尽①Y源調(diào)用的錯誤率族奢、數(shù)據(jù)庫更新頻率突然飆升姥闭,某個接口訪問數(shù)異常,寫代碼其實(shí)很容易越走,難的是如何知道系統(tǒng)出現(xiàn)異常背后的原因棚品。
監(jiān)控軟件有很多靠欢,在使用的時候一定要精確定義閾值和閾值背后的含義。
比如說我們公司也有監(jiān)控系統(tǒng)铜跑,可問題出了后還是沒有通過監(jiān)控系統(tǒng)發(fā)現(xiàn)门怪,最后發(fā)現(xiàn)報警短信太多了,忽略了锅纺,運(yùn)維和開發(fā)人員對于報警短信也麻木了掷空,所以說使用監(jiān)控系統(tǒng)很簡單,正確使用則有難度囤锉。
八 WIKI 系統(tǒng)
WIKI坦弟,知識管理系統(tǒng),個人理解其實(shí)就是提倡寫文檔嚼锄。文檔的作用很多减拭,如何寫不重要,重要的是這個文檔的作用是干嘛的区丑?能讓人明白嗎拧粪?
假如一個新員工來了,看了文檔后沧侥,就知道系統(tǒng)包括了什么模塊可霎,自己如何快速開發(fā),如何上線宴杀,這就是一個好文檔癣朗。
假如要優(yōu)化一個原有的服務(wù),開發(fā)人員不是通過代碼去找邏輯旺罢,而是通過文檔去了解大概的邏輯和包含的模塊旷余,當(dāng)然文檔也不需要太詳細(xì)。
文檔是開發(fā)人員和運(yùn)維人員之間的協(xié)作工具扁达,比如服務(wù)器的 IP 是多少正卧,系統(tǒng)中資源的路徑和 IP 是多少(比如數(shù)據(jù)庫的域名、外部 API 的地址)跪解。
說個簡單的笑話炉旷,原來公司運(yùn)維人員維護(hù)了一百多個 Memcached 端口,最后發(fā)現(xiàn)找不到使用方是誰了叉讥,最后不得不發(fā)郵件讓大家認(rèn)領(lǐng)窘行,可大部分最后也沒人認(rèn)領(lǐng),有了文檔這些問題就能解決了。
文檔是開發(fā)人員之間的協(xié)作工具,在創(chuàng)業(yè)團(tuán)隊(duì)李剖,變化太快了,大部分都是通過人與人之間的溝通翘骂,可溝通假如總是變化壁熄,最后發(fā)現(xiàn)雙方理解的有偏差,浪費(fèi)了很多開發(fā)時間碳竟,而約定的文檔能在一定程度上解決這問題草丧。
上面舉得例子就簡單解釋了文檔的重要性,其實(shí)文檔代表了一種開發(fā)思維莹桅,可以這么說沒有文檔昌执,代表開發(fā)混亂,有了文檔從側(cè)面也能大概看出代碼實(shí)現(xiàn)的是否合理诈泼,這才是文檔最重要的作用懂拾。
寫文檔應(yīng)該避免的幾個誤區(qū):
不要太遵循寫作規(guī)則,能夠說清楚就行铐达。有些開發(fā)人員不想寫文檔的原因之一就是寫文檔比寫代碼還要求嚴(yán)格岖赋。
文檔一定要保持更新,比如說一個功能上線初期是有文檔的瓮孙,后來代碼一直在迭代唐断,最后開發(fā)人員發(fā)現(xiàn)文檔和代碼的邏輯完全不一樣,大家也就失去了看文檔的動力杭抠,所以文檔最重要的就是要持續(xù)更新脸甘。
文檔不要強(qiáng)制開發(fā)人員去寫,也不用及時讓大家去更新偏灿,約束少一點(diǎn)可能效果更好丹诀。
九 代碼構(gòu)建,部署&發(fā)布系統(tǒng)
對于創(chuàng)業(yè)團(tuán)隊(duì)來說翁垂,假如一個新員工來了铆遭,需要快速能夠讓其進(jìn)行開發(fā),所以需要有一套集成化的環(huán)境沿猜,主要包括:代碼協(xié)作工具疚脐,代碼構(gòu)建,代碼部署(開發(fā)環(huán)境邢疙、仿真環(huán)境、線上環(huán)境)望薄。
為什么需要這套環(huán)境呢疟游?有兩個目的:
為了縮短產(chǎn)品上線時間,讓技術(shù)人員專注于業(yè)務(wù)開發(fā)痕支,而不是被其他的一些因素困擾颁虐。
為了產(chǎn)品的質(zhì)量。
在很多開發(fā)團(tuán)隊(duì)卧须,有的時候出現(xiàn)問題另绩,都是開發(fā)人員直接線上修改代碼儒陨,從而導(dǎo)致潛在的問題;還有任何開發(fā)人員都有線上的服務(wù)器的權(quán)限笋籽,導(dǎo)致安全性得不到保障蹦漠。
在產(chǎn)品上線后,測試人員說怎么測試的時候沒有問題车海,一上線就有問題笛园,開發(fā)人員說測試人員測試的環(huán)境不是線上環(huán)境;新來一個員工侍芝,一個星期都沒法搭建自己的開發(fā)環(huán)境研铆。
反正很多此類問題,從而也導(dǎo)致了時間的浪費(fèi)和質(zhì)量的下降州叠,而更大的危害就是失去別人的信任棵红。
所以有這樣一套環(huán)境很重要,不用特別的高大上咧栗。下面就簡單說說:
首先要有一個代碼版本控制系統(tǒng)逆甜,這個現(xiàn)在大部分都會使用,也不用特別介意用 SVN 還是用 Git楼熄。
讓運(yùn)維人員寫一個腳本忆绰,能夠配置開發(fā)環(huán)境、仿真環(huán)境可岂、線上環(huán)境(環(huán)境一定要隔離)错敢,說真的,簡單的 Shell 腳本就能完成缕粹。
這里的環(huán)境不僅僅是服務(wù)器稚茅,包括數(shù)據(jù)庫資源等等,這時候大家也意識到 WiKi 的重要性了平斩,假如沒有文檔亚享,不可能能搭建這樣的系統(tǒng)。
代碼構(gòu)建系統(tǒng)绘面,在 PHP 這樣的高級語言中欺税,本質(zhì)上不存在代碼構(gòu)建這一說,假如有特殊需要揭璃,也可以通過 Shell 腳本來實(shí)現(xiàn)晚凿。
代碼部署系統(tǒng),在開發(fā)環(huán)境中瘦馍,完全可以借助 IDE 和 FTP 將實(shí)時變動的代碼同步到開發(fā)環(huán)境中歼秽。
假如代碼需要部署到線上,可以借助于 SVN 和 rsync 這樣的工具將有差異的代碼快速發(fā)布到線上情组,有問題也支持快速的回滾燥筷。
十 開發(fā)人員也要做運(yùn)維
運(yùn)維這個崗位其實(shí)需要了解網(wǎng)絡(luò)箩祥,Linux ,Shell 等相關(guān)知識肆氓,而開發(fā)人員本身也應(yīng)該掌握這些知識袍祖。
假如開發(fā)人員不了解這些,而只是會編碼做院,那代表他并不真正會編碼盲泛,了解這些知識開發(fā)人員可以更好的理解一個系統(tǒng),當(dāng)系統(tǒng)出現(xiàn)問題的時候能夠從多方面去排查键耕,更好的維護(hù)寺滚。
在我工作的這么多年中,開發(fā)崗位和運(yùn)維崗位總是不能很好的協(xié)作屈雄,出現(xiàn)問題的時候開發(fā)人員說這是網(wǎng)絡(luò)問題村视,是運(yùn)維的服務(wù)器不夠,或者說數(shù)據(jù)庫響應(yīng)慢酒奶。
而運(yùn)維人員則更痛苦蚁孔,你開發(fā)人員寫的什么程序啊,數(shù)據(jù)庫全是聯(lián)合查詢惋嚎,導(dǎo)致數(shù)據(jù)庫性能嚴(yán)重下降杠氢。
或者說上線一個項(xiàng)目我們啥也不知道,你讓我們怎么運(yùn)維另伍?出現(xiàn)這些問題的原因在于雙方對于對方掌握的技術(shù)領(lǐng)域不了解鼻百,互相不理解或者不明白對方的職責(zé),而這些會導(dǎo)致整個產(chǎn)品和系統(tǒng)的穩(wěn)定性出現(xiàn)很大的問題摆尝。
所以對于創(chuàng)業(yè)團(tuán)隊(duì)來說温艇,假如技術(shù)能力足夠,運(yùn)維工作盡量由開發(fā)人員來做堕汞,當(dāng)然這里的運(yùn)維可能更多的是產(chǎn)品運(yùn)維的角色(在大企業(yè)勺爱,運(yùn)維崗位的分工也越來越明確)。
具體的工作比如說安裝軟件開發(fā)包讯检,進(jìn)行 Nginx琐鲁、PHP 配置,切割日志人灼,這些工作本身也不復(fù)雜绣否,開發(fā)人員假如能夠掌握好,對于系統(tǒng)的維護(hù)是有極大的好處的挡毅。
另外,潛意識告訴開發(fā)人員暴构,出現(xiàn)問題沒有人能依賴跪呈,代碼和環(huán)境需要你自己去攻克段磨。
以上說的觀點(diǎn)大家可能發(fā)現(xiàn)了一個規(guī)律,這些都不涉及到人的因素(比如開發(fā)人員素質(zhì)耗绿,協(xié)作能力)苹支,大家只要遵守就能很好的完成。
而完成這些误阻,就能解決軟件開發(fā)中的大部分問題债蜜,讓你的系統(tǒng)更穩(wěn)健,讓你的開發(fā)更快速究反,讓你的成本更低寻定。
對于創(chuàng)業(yè)團(tuán)隊(duì)開發(fā)人員來說,不要高度追求技術(shù)的高大上精耐,有效解決問題很重要狼速。
作者:虞大膽(虞衛(wèi)東)