從7.10來到點(diǎn)評實(shí)習(xí)腊尚,已經(jīng)過了2個(gè)半月。
在這里總結(jié)一下自己的收獲满哪。
- Java
(面向切面)一直很喜歡用注解婿斥,雖然了解面向切面的概念,但是沒有自己去做過哨鸭。在點(diǎn)評的實(shí)習(xí)期間民宿,看到衛(wèi)平會寫一些自己注解,由此自己也去學(xué)會了自定義注解以及使用@Aspect來包裹自己的代碼像鸡。比如說對特定的Exception來觸發(fā)一個(gè)郵件通知活鹰,其間要感覺衛(wèi)平的一些幫助
(Spring)盡管從寫Java web開始就是Spring的用戶,后來即使脫離了Web也喜歡用它的全家桶Spring Boot, Spring Data這些只估。但是其實(shí)來點(diǎn)評之前我從未自己完整搭建一個(gè)Spring的Web項(xiàng)目(Spring Boot是開箱即用的)實(shí)習(xí)期間對XML配置減少了幾分抵觸志群,也對Spring提倡的Java Config做了一點(diǎn)嘗試,包括結(jié)合這兩種配置蛔钙,在一個(gè)非Boot的Spring項(xiàng)目中拋棄XML等锌云。期間遇到一些問題,都是袁浩厲害吁脱,我跟著學(xué)了一些
(Mybatis)盡管以前就聽說業(yè)界喜歡Mybatis桑涎,而我一直用的是Hibernate。感覺起來Mybatis更像JDBC, Hibernate則契合JPA規(guī)范兼贡,并且有一套標(biāo)準(zhǔn)的JPA接口與實(shí)現(xiàn)攻冷。至于Spring Data JPA,更加簡化了db訪問紧显。對于Mybatis每次根據(jù)表生成實(shí)體類讲衫,表的變動將覆蓋mapper文件以至于要手動merge這件事兒始終還是不喜歡……
(跨域)這個(gè)問題一開始出現(xiàn)的時(shí)候是我和舍友做母嬰商店那會兒……當(dāng)時(shí)我們在chrome里面調(diào)用沒問題,用ajax報(bào)錯(cuò),還煞有介事在stackoverflow找為啥涉兽。后來雖然解決了但是很糙就是添加一個(gè)@crossorigin的注釋招驴。來了點(diǎn)評以后詳細(xì)的了解為什么會出現(xiàn)跨域問題以及解決方式還有JSONP是啥
(關(guān)于遠(yuǎn)程調(diào)用)因?yàn)槭躌EST, Spring Boot, Spring Cloud影響,一直覺得HTTP是一個(gè)極好的調(diào)用方式枷畏。然而在點(diǎn)評這樣的公司里别厘,無論是因?yàn)樾阅艿木壒驶蚴瞧渌裁纯紤],并沒有這樣做……
- 開發(fā)習(xí)慣
(Log很重要)在過去的項(xiàng)目里拥诡,總是不重視log触趴,又或者說,要么是本身項(xiàng)目簡單渴肉,要么說本身質(zhì)量管理就不存在冗懦。經(jīng)常依賴于在IDE中debug來找問題,極其不喜歡去服務(wù)器端看log文件仇祭。而事實(shí)上披蕉,在你沒有辦法debug的時(shí)候,log對于排錯(cuò)而言是很重要的乌奇,借助于此可以了解到一些模塊具體的執(zhí)行狀態(tài)没讲。此外,一個(gè)運(yùn)行中的系統(tǒng)礁苗,如果出現(xiàn)錯(cuò)誤爬凑,應(yīng)該把這些預(yù)期到的或是未預(yù)期到的都打印出來,通過閱讀log便能定位到問題试伙。
(防御式編程)質(zhì)量上的另一重嘁信,所有的網(wǎng)絡(luò)請求,依賴其他人的服務(wù)迁霎,數(shù)據(jù)庫訪問吱抚,用戶輸入百宇,這些都是在一開始應(yīng)該考慮其如果崩潰自己的系統(tǒng)應(yīng)該如何應(yīng)對考廉,而不是樂觀相信這些外界服務(wù)總是良好的。這一點(diǎn)兒我自己此前很多時(shí)候因?yàn)橥祽胁辉敢馊タ紤]邊界情況携御,造成質(zhì)量可能不夠高的情況下昌粤,在企業(yè)級開發(fā)中是極其業(yè)余和不應(yīng)該的,所有可能會發(fā)生錯(cuò)誤的地方都應(yīng)該妥善提供處理方法啄刹,在點(diǎn)評這樣的系統(tǒng)中涮坐,應(yīng)該保障無論如何不會出現(xiàn)用戶可見的問題,至少要做到予以一個(gè)優(yōu)雅的錯(cuò)誤告知/退出誓军。
(性能)能夠批處理的請求(數(shù)據(jù)庫袱讹、遠(yuǎn)程服務(wù)),理應(yīng)提供一個(gè)批量的接口,或者在一些情境下并發(fā)進(jìn)行捷雕,而應(yīng)該避免去循環(huán)去調(diào)用椒丧。而線程數(shù)需要根據(jù)機(jī)器實(shí)際核心數(shù)、操作所需時(shí)間救巷、應(yīng)用場景進(jìn)行設(shè)置壶熏,設(shè)置線程池的核心線程數(shù)、最大線程數(shù)浦译、隊(duì)列類型時(shí)應(yīng)該慎重棒假,而不是覺得差不多就好。提供給前端的服務(wù)精盅,又或者是提供給第三方的服務(wù)帽哑,應(yīng)該去關(guān)注其響應(yīng)時(shí)間,并且盡可能保證在10-100ms這樣一個(gè)數(shù)量級叹俏,無論是服務(wù)響應(yīng)時(shí)間還是數(shù)據(jù)庫查詢時(shí)間祝拯,都應(yīng)該予以關(guān)注,并且在其不滿足要求時(shí)考慮如何重構(gòu)她肯。在成熟的系統(tǒng)中佳头,不能存在明顯的完全可以解決和避免的短板,在正常的訪問下正常晴氨,也需要保證在預(yù)期可接受的負(fù)載內(nèi)正常康嘉。
(協(xié)作)對外接口、實(shí)體類多寫注釋籽前,來降低閱讀代碼的難度亭珍,類注釋可以描述一下這個(gè)類是干嘛用的,方法的注釋如果必要可以給一個(gè)調(diào)用事例等等枝哄。盡管這么做會顯得很多余肄梨,但是我認(rèn)為這是一個(gè)好習(xí)慣。寫別人和自己都能看得懂的注釋挠锥,交代一些基本內(nèi)容众羡,是應(yīng)該的。調(diào)用對方服務(wù)時(shí)蓖租,能自己確認(rèn)的自己確認(rèn)粱侣,不能確認(rèn)的應(yīng)該即使和對方溝通清楚、不留隱患蓖宦。在企業(yè)中齐婴,文檔不全,甚至作者已經(jīng)離職的情況很常見稠茂,應(yīng)該自己想辦法克服結(jié)局柠偶、不能把鍋甩給文檔。
(Git與Maven)在Maven中,一開始就盡可能使用<DependencyManagement>
來指定版本诱担,好過一個(gè)個(gè)exclude
鲫售。Dependency Analyzer
是個(gè)好插件。開發(fā)中應(yīng)該絕不在master分支開發(fā)该肴,如果每次commit能夠盡量的是原子的情竹,每個(gè)分支對應(yīng)一項(xiàng)需求或者一個(gè)功能點(diǎn),這樣萬一出錯(cuò)了匀哄,排查問題秦效,或者回滾都很方便。如果commit信息幾乎是無意義的涎嚼、分支僅僅作為一個(gè)個(gè)人工作區(qū)與其他人隔開阱州,終究還是浪費(fèi)了Git作為一個(gè)版本控制工具的職能
(監(jiān)控很重要)在Spring Boot中,有actuator這樣一個(gè)模塊法梯,其內(nèi)置了一些基礎(chǔ)的監(jiān)控苔货,可以通過http等手段來獲得系統(tǒng)的實(shí)時(shí)的一些指標(biāo),也可以很容易地通過實(shí)現(xiàn)HealthIndicator
來定制自己的監(jiān)控立哑。以前沒有在意這個(gè)事情夜惭,上次聽了du.yi的case study以及后來高師傅指出的,覺得這一點(diǎn)兒是很重要的铛绰。 聽聞JavaEE 8 中也加入了這一內(nèi)容诈茧。前兩天Java 9 與JavaEE 8一起發(fā)布,待確認(rèn)……
- 前端
學(xué)會了最基本的一些CSS捂掰,js敢会,終于用上了bootstrap和JQuery然后轉(zhuǎn)投了一些Vue.js與一些組件庫,在實(shí)習(xí)期間從運(yùn)營后臺起步这嚣,終于能夠使用Vue.js進(jìn)行前端開發(fā)鸥昏,由此了解了一些周邊的npm,node姐帚,webpack吏垮,算是踏出了第一步,完整了一下自己以前想做一個(gè)業(yè)務(wù)地全棧的技能點(diǎn)卧土。其實(shí)在很早以前嘗試學(xué)習(xí)過node在web端的使用惫皱,但是后來沒有繼續(xù)像樊,打算之后安排一些時(shí)間去詳細(xì)學(xué)習(xí)Node尤莺,ES6,重點(diǎn)關(guān)注一些其性能上的特點(diǎn)以及V8虛擬機(jī)