本文的內(nèi)容有別于之前文章中純技術(shù)的探討,會從業(yè)務邏輯厌杜、技術(shù)奉呛、團隊和方法論的角度探討如何快速高效地完成一個Android項目。當然夯尽,快速高效是有前提的,第一登馒,本文依然是從研發(fā)的角度來談如何把控項目的匙握,而這種研發(fā)人正如陳皓在《技術(shù)人員的發(fā)展之路》中提到的,需要具備高效的學習能力和解決問題的能力陈轿。另外圈纺,快速需要保證質(zhì)量秦忿,沒有質(zhì)量的速度是不負責任的。
一蛾娶、業(yè)務邏輯
計算機科學的核心是通過數(shù)據(jù)結(jié)構(gòu)和算法實現(xiàn)對現(xiàn)實世界的抽象灯谣,平臺是會隨著技術(shù)發(fā)展不斷變遷的,只有數(shù)據(jù)本身所描述的這種抽象才是事物永恒的本質(zhì)蛔琅。作為研發(fā)胎许,筆者推薦通過數(shù)據(jù)結(jié)構(gòu)來理解業(yè)務邏輯,比如罗售,數(shù)據(jù)庫建模需要對系統(tǒng)中所有的實體關(guān)系進行抽象辜窑,是理解業(yè)務邏輯的核心。當然寨躁,可能有不少App研發(fā)人對后臺的業(yè)務邏輯并不太關(guān)心穆碎,但實話講,任何依賴于平臺(Windows职恳、Symbian所禀、Android、iOS……)的開發(fā)者是沒有安全感的放钦,平臺是會不斷迭代的北秽,研發(fā)人需要去抓住那些本質(zhì)的、穩(wěn)定的計算機科學的核心知識最筒。有點跑題贺氓,舉個栗子,一個進銷存管理的Android軟件床蜘,先拋開復雜的辙培、精細的管理流程不講,從最小可行產(chǎn)品(MVP)來說邢锯,主要會包括如下業(yè)務:
- 進貨=選商品+加庫存扬蕊;
- 銷售=選商品+減庫存;
- 庫存=查庫存+庫存修改(商品修改)丹擎;
- 基礎(chǔ)資料=新增/修改店鋪+新增/修改商品尾抑;
- 報表=入出操作流水。
對于一個店鋪來講蒂培,進貨需要選品和增加庫存量再愈,選品的方式可能包括掃描69碼或從庫存添加(69碼最終也會對應庫存中的SKU);銷售包含選品和減少庫存量护戳;庫存包含增刪改查等基本操作翎冲;基礎(chǔ)資料包含店鋪信息、人員信息媳荒、設(shè)備信息等抗悍;基礎(chǔ)報表包含利潤驹饺、進貨明細、銷售明細缴渊、對賬等操作流水赏壹。當然,上述業(yè)務框架僅僅是MVP衔沼,并未考慮ERP蝌借、WMS中精細化管理的各種場景,但對于App的研發(fā)來講俐巴,這也是最基礎(chǔ)需要了解的骨望。
二、技術(shù)
本節(jié)將從Android開發(fā)的角度來說明在快速開發(fā)中最常用欣舵、最重要的幾點技術(shù):
- 數(shù)據(jù)結(jié)構(gòu)和算法擎鸠。正如業(yè)務邏輯中講到的,數(shù)據(jù)結(jié)構(gòu)和算法是軟件技術(shù)的核心缘圈,在快速Android開發(fā)過程中劣光,需要了解Java中的各種數(shù)據(jù)類型的實現(xiàn)及原理。比如下列問題是否了然于胸糟把?
1绢涡、List、Queue遣疯、Stack的實現(xiàn)有哪些異同雄可?ArrayList如何實現(xiàn)擴容?PriorityQueue缠犀、LinkedBlockQueue的主要特性是什么数苫?直接在循環(huán)中刪除List的元素為什么會報ConcurrentModificationException?
2辨液、如何實現(xiàn)樹的深度遍歷虐急、廣度遍歷?文件系統(tǒng)如何使用二叉樹建模滔迈?紅黑樹有什么特性止吁,主要的應用場景是什么?
3燎悍、Hash原理是什么敬惦?HashMap的Key有什么注意事項?Java中是如何解決Hash沖突的间涵,有哪些解決Hash沖突的辦法仁热?基于Hash沖突的攻擊是什么原理?為什么要重寫hashcode和equals方法勾哩?LinkedHashMap抗蠢、TreeMap以及SortMap有什么異同,各自的應用場景是什么思劳?Map如何通過迭代器進行遍歷迅矛?
4、如何對Collections中的元素進行排序潜叛?Compareable和Comparator有什么區(qū)別秽褒?如何實現(xiàn)線程安全的集合類?常見的并發(fā)場景有哪些威兜?閉鎖销斟、FutureTask、信號量椒舵、柵欄等各自的應用場景是什么蚂踊,實現(xiàn)原理?如何將串行任務并行化笔宿?鎖的實現(xiàn)原理是什么犁钟?
- Android中的View、WMS及AMS的知識泼橘。如果是數(shù)據(jù)是應用的靈魂涝动,那么View、WMS及AMS就是應用的外觀炬灭。因此醋粟,應用要求良好的交互性、體驗等重归,就需要深入理解View的原理及WMS的知識米愿。比如下列常見的問題是否理解?
1提前、RecyclerView的使用吗货,是否了解其與ListView的區(qū)別?RecyclerView嵌套與適配器狈网?如何響應Item中控件的操作宙搬?如何在RecyclerView與Activity之間通信,并實現(xiàn)數(shù)據(jù)聯(lián)動拓哺?RecyclerView在ScrollView中的顯示需要注意什么問題勇垛?
2、自定義View需要重寫哪些方法士鸥?invalidate()和postInvalidate() 的區(qū)別及使用闲孤?如何實現(xiàn)具有動畫效果的View?View的層次關(guān)系是什么烤礁?Android中的事件類型有哪些讼积?事件的傳遞過程肥照?ViewGroup和View在事件處理方面有什么異同?
3勤众、Activity界面的層次舆绎?Window、WindowManager以及WindowManagerService之間的關(guān)系们颜?如何通信吕朵?
4、Activity的啟動過程如何窥突?主線程消息隊列如何啟動努溃?ActivityThread與AMS如何通信?Activity在異常情況下的生命周期阻问?如何在Service中實現(xiàn)對Activity的跨進程回調(diào)梧税?
需要說明的,這里提到的技術(shù)點并不是像面試中問到的则拷,因為面試時需要探探應試者的深度贡蓖,這里主要是說明快速開發(fā)中直接使用的技術(shù),也是最需要掌握的基礎(chǔ)知識煌茬。筆者最近準備寫個系列文章斥铺,從八個方面來說明對Android開發(fā)的理解,主要包括:數(shù)據(jù)結(jié)構(gòu)與算法坛善、網(wǎng)絡通信編程晾蜘、線程與并發(fā)、進程的通信與調(diào)度眠屎、View體系及WMS剔交、四大組件及AMS、設(shè)計模式與架構(gòu)改衩、性能優(yōu)化與虛擬機岖常,敬請期待~~
三、團隊
在需要快速高效完成項目的場景下葫督,團隊的溝通竭鞍、協(xié)作是非常重要的。如何帶領(lǐng)一個Android開發(fā)團隊橄镜,這里列出幾個筆者認為比較重要的點:
- 研發(fā)團隊不能管理的太緊偎快,關(guān)鍵是要制定好標準,搭好框架洽胶,然后在遵循統(tǒng)一的標準下保持進度晒夹。研發(fā)要避免過度管理,自由、開放的環(huán)境更有利于產(chǎn)品研發(fā)工作丐怯,流程喷好、制度約束太多對創(chuàng)新無益。團隊成員更多的是協(xié)作响逢,而不是管理绒窑。
- 技術(shù)團隊Leader的工作包括:搭建穩(wěn)定棕孙、可靠的開發(fā)框架舔亭,模塊化、插件化架構(gòu)蟀俊,網(wǎng)絡通信請求回調(diào)方法钦铺,單元測試流程,技術(shù)調(diào)研肢预,渠道包管理矛洞,產(chǎn)品、UI和測試團隊的溝通協(xié)作烫映,需求討論及工期安排沼本,各種核心流程圖及文檔,Code Review锭沟,崩潰日志分析及處理等等
- 團隊是有人構(gòu)成的抽兆,團隊中需要有各種不同類型的人,有擔當族淮、能救火的人辫红;有遠見、能防火的人祝辣;有執(zhí)行力贴妻、靠譜的人;有喜感蝙斜、能活躍氛圍的人名惩;有獨立思考、事事能提出不同意見的人……以上總總孕荠,只要是能給團隊帶來正面影響的人娩鹉,作為團隊Leader,一定要以開放岛琼、妥協(xié)底循、灰度的眼光求同存異。
四槐瑞、方法論
從個人的角度來講熙涤,如何在高度壓力之下完成大量的工作?不管在公司承擔重要項目,還是自己創(chuàng)業(yè)祠挫,這都是不可避免的話題那槽。以下談談筆者個人的體會和方法:
- 節(jié)奏。工作的時候要全身心投入等舔,避免各種打擾骚灸,比如測試提的BUG,各種會議慌植,要盡量保證工作的連續(xù)性甚牲,避免被打擾。完成了一周緊張的工作蝶柿,要及時的休息丈钙,腦袋里完全拋開工作上的事情,做一些其他輕松的事情交汤,比如筆者喜歡寫寫毛筆字雏赦、喝點小酒,總之芙扎,做一些與工作完全無關(guān)的事情星岗。
- 計劃。凡事遇則立戒洼,不預則廢俏橘,一定要有計劃,要有明確的條理施逾,知道今天該完成什么敷矫,明天該完成什么,進度該怎么把控汉额,有什么風險點曹仗,所有的事情一定要提前定好計劃,沒有準備的仗是一定打不贏的蠕搜。有了計劃之后怎茫,才會工作的走向有所把控,心里才有底妓灌,面對領(lǐng)導轨蛤、同事以及相關(guān)工作人的時候,才會有底氣虫埂,也才會有自信心祥山。
最后,和大家分享一個經(jīng)歷和體會掉伏,與本文標題沒有直接關(guān)系缝呕,沒興趣的話可以直接跳過澳窑。
上上周末完成了一次從北京的東南到西北的徒步穿越,全程接近40公里供常。徒步是最簡單的一種思考方式摊聋,用腳步這種最原始的方式去經(jīng)歷每一處風景。
- 在你到達目標的過程中栈暇,不可能一條平坦開闊的大路走到底麻裁,還要去走很多沒人走過的小路。大路走的人多源祈,你覺得很有安全感煎源;小路人跡罕至,你很擔心自己走錯新博。但如果你的目標是終點薪夕,你就勇敢的走下去吧。其實路沒有大小赫悄,只有你是否能通過此路到達目標。
- 如果你一開始就決定要走一條很長的路馏慨,那么一開始的走左邊埂淮,還是右邊其實影響不大,到達目標的路徑有千萬種選擇写隶。對于一個長跑選手來說倔撞,重要的是方向和節(jié)奏。只要大方向?qū)δ脚浚?*為起點痪蝇,只要朝著西北方向,保持每小時3-5公里的節(jié)奏冕房,目標終能到達躏啰。
- 人走在路上,到了中點的時候耙册,可能腳下已經(jīng)起了水泡给僵,每走一步都很疼。這正如人到中年详拙,工作帝际、職場、家人饶辙、身體已經(jīng)已經(jīng)落下很多的問題蹲诀,要去解決這些問題,就會很疼弃揽。往回走脯爪,就是失斏河丁;站在原地披粟,就會彷徨咒锻;所以只能往前走,遇到困難守屉,死活頂上去惑艇,保持進步的節(jié)奏,你才可能朝目標前進拇泛。很多人到了中年之后開始向各種問題妥協(xié)滨巴,其實就相當于站在原地,彷徨俺叭。
以上恭取。