發表文章

必要書單

clean code clean architecture 一线架构师实践指南(温昱) 面向对象分析与设计.第3版.(美)Grady booch 企业应用架构模式(中文版) OOD启思录  领域驱动设计:软件核心复杂性应对之道 敏捷软件开发:原则、模式与实践/软件工程实践

spring security

Spring Security  分成 認證跟授權 Spring Security在進行安全驗證時收到輸入請求中的使用者名稱(username),然後呼叫UserDetailsService.loadUserByUsername(String username)並傳入username去「記錄使用者資訊的地方」尋找對應的使用者,然後將找到的使用者資訊以UserDetails的形式回傳給AuthenticationProvider(的實作)進行接下來的驗證。 https://chikuwa-tech-study.blogspot.com/2021/06/spring-boot-security-authentication-and-authorization.html https://matthung0807.blogspot.com/2019/09/spring-security-userdetailsservice.html https://www.toptal.com/spring/spring-security-tutorial https://x8795278.blogspot.com/2019/12/spring-boot-spring-security-rest-api.html

關鍵字

 CAP理論 4+1 架构视图模型 事件溯源 事件驅動 pubsub 發布訂閱 觀察者模式 XA / DTM 单点登录 gprc vs mqtt LWM2M/CoAP SOA VS SAAS 二階段提交 分布式授權 CQS是 function等級的設計 CQRS是 module等級的設計 魯棒圖

docker 面試

https://www.runoob.com/docker/docker-hello-world.html https://yeasy.gitbook.io/docker_practice/image/dockerfile docker run docker exec  docker start docker stop docker ps docker logs docker exec -it docker rm -f  

技術棧

 git:      sourcetree     gitlab flow restful api:     rate limit     冪等性     elk 監控     restful 規範 後端開發:     user story     use case      http://www.cjwind.idv.tw/OOAD-software-develop-cycle/ http://apframework.com/2020/03/22/ddd-color/ 項目: 適當的 transaction 和 try catch log 跟 email 當作 service 的一部分 用 interface 注入 該用啥資料庫就用啥 mysql 正規化 索引 使用 redis 快取結果 nosql 記錄其他內容 event、job queue、cronjob 架構 模組 上下文 切割程式碼  掌握所有系統跟資料庫的狀態 系統監控 資料庫監控 消息队列  = 异步、削峰、解耦 https://www.zhihu.com/people/aobingJava

DDD

誰使用domain service entity 能直接調用 repo 嗎 是否一定要聚合 區分bounded context 可以假設有多個部門或是多個開發者 參與主體 鲍勃大爷:先设计对象的行为,再设计数据库的表结构! 先考慮參與者 为了识别某个概念是否属于某个限界上下文,问题就变成了: 是否都符合该主题的通用语言的要求? 是否与该主题无关? 是否更符合该主题的通用语言? 是否是该主题的通用语言? DDD 是設計方法 每個BC可以用MVC架構也可以用clean architecture架構  最後都是回到ooad 所以去探討實作細節不如去看clean architecture  DDD還是著重在BC跟子域就好 跟對方公司部門 或是工程部門有關 https://www.jdon.com/53988 KISS 單一職責 DDD 戰略設計 + clean architecture 物件設計的判斷依據 行為 跟 資料 如何被使用 如果多增了一個類型要如何更改 如果依賴的東西變了 會怎麼被影響 如果物件改變了 依賴這個物件的class會如何被影響

單一職責

只做一件事 只有一個改變的理由 開發程式的人必須對程式負責 不同職責的程式應該可以給不同的人開發而不互相影響 程式出錯只會找上一個人 而不是多個人 程式必須對使用他的人負責 職責改變並不影響使用者 程式必須對職責負責  職責改變只改變對他負責的程式 不改變使用者使用的情形 使用人 -> 程式 -> 職責 開發者 -> 程式 -> 職責 一個程式只負責一個職責 一個程式只給一個人開發 錯誤時只需找一個人負責 不會影響到其他程式 職責改變只會影響一個程式 只需改變一個程式 一個程式會給多個使用者使用 錯誤的點: 過多 class 是錯的 class 應該要有完整職責  single action 是錯的 class 應該要有完整職責 repository interface沒有 function 是錯的 interface 應該要有完整職責

守則

 單元測試一定要可以直接運行 不依賴任何東西 一定要正規化資料庫 單一職責代表改需求只需改動一個地方 充血模型跟貧血模型沒有好壞 充血模型 比較優雅複雜 貧血模型 粗暴簡單 class 不要過多 會類爆炸 適度  單元測試逃不掉 single action是錯誤的 過多的class是錯誤的 repository的interface沒有function是錯誤的 組件間必須是單向關係 輔助組件必須指向核心組件 P65 步驟: 抓名詞 => user story => use case => 分析物件 模型 找出限界上下文 => 投射心智模型 => 封裝 單一職責 => 不管資料庫設計 => 每次開發都會得到新的特性 所以需要不斷調整模型和文件 => 重構  工作單元 最少驚訝原則 軟體接口如硬體接口 對象有狀態 行為 標識符 物件與物件的關聯 可以看成通道 有通道才能發送消息 對象責任代表維護知識跟可以執行的動作 正確使用 mysql Redis 事務跟 sharedlock 和 lockForUpdate

php 面試題

laravel 7 特性 laravel 8 特性 php 7 特性 php 8 特性 Names Arguments JIT Union Types Constructor Property Promotion Null-Safe Operator Trailing Comma in Parameters Match Expression Attributes WeakMaps Mixed Type Throw Exception From New Places Call ::class on objects Non-Capturing Catch New String Functions class vs trait 執行順序 callback clean architecture ddd https://docs.kilvn.com/tipi/ https://imyoungyang.gitbooks.io/php7-study-group-notes/content/Chapter2/php-trait.html

java資料結構

https://www.mygreatlearning.com/blog/data-structures-using-java/ Array Linked List Stack  Queue Binary Tree Binary Search Tree Heap Hashing  Graph Array 固定長度 初始化: int a[] = {1,2,3};  int a[] = new int[]{1,2,3} int a[] = new int[3] int a[3] = new int[]{1,2,3} X int a[] = new int[3]{1,2,3} X

編程原則

高併發

流量削锋 重要的是資料庫,到資料庫的請求必須少 消息隊列解決削峰 中間通過一個隊列在一端承接瞬時的流量洪峰,在另一端平滑地將消息推送出去。 流量削锋漏斗模型: CDN>緩存>後端>資料庫 秒杀或团抢 聊天室 旋轉拍賣 Idempotency Key: 每個 Request 一定會有一個「唯一」可被識別的 Key Routing Proxy failover throttling Fulfillment Gateway  參考系統:  火車票、秒殺搶購、聊天室 https://ithelp.ithome.com.tw/articles/10243807 https://ithelp.ithome.com.tw/articles/10216645 http://www.dockone.io/article/10015 https://blog.csdn.net/mango_love/article/details/106443098

java 多線程

分布式事务  ACID 分布式事务最经典的七种解决方案 https://segmentfault.com/a/1190000040321750 大白话讲解脏写、脏读、不可重复读和幻读 https://blog.csdn.net/qq_41549632/article/details/116654201 彻底搞懂 MySQL 事务的隔离级别 https://developer.aliyun.com/article/743691 图解脏写、脏读、不可重复读、幻读 https://mp.weixin.qq.com/s?__biz=MzI5MzQ2MDg4Nw==&mid=2247483812&idx=1&sn=dc24a2c69481b27b08da6199be654e07&chksm=ec708f5cdb07064a1f00f12a9fbfa5e278b0721d7d766c0c189d9e05250a1255557313a63a4b&scene=21#wechat_redirect 多线程基础 https://www.liaoxuefeng.com/wiki/1252599548343744/1304521607217185 https://www.youtube.com/playlist?list=PLdtC50H09WTAbZYIjN63uj7DtsjOCngrV

leetcode經典題

55. Jump Game 1143. Longest Common Subsequence  46. Permutations 53. Maximum Subarray 77. Combinations 45. Jump Game II 322. Coin Change 300. Longest Increasing Subsequence

use case 粒度

 use case的粒度取決於單一職責 只有一個改變的理由跟tdd測試驅動 方便測試 覆用 只關注業務邏輯 不關注怎麼存資料庫 用例驅動 vs 領域驅動

系統設計

https://github.com/checkcheckzz/system-design-interview https://www.interviewbit.com/courses/system-design/ https://ithelp.ithome.com.tw/articles/10235277 需求  CAP原則 規模估算 儲存量估算 頻寬估算 Data sharding APIs 技術: load balancer cache db 兩種pagination的方式 offset base cursor base 取決於內容是靜態還是動態 Pull model又稱為Fan-out on load Push model又稱為Fan-out on write hybrid model 對於follower不多的人 使用Push model 對於follower多的人 使用Pull model SELECT * FROM products OFFSET 0 LIMIT 50; 效能隨著table大小變差 LRU https://josephjsf2.github.io/data/structure/and/algorithm/2020/05/09/LRU.html Access pattern? Write back(有空的話Write through, write around, write back都要知道什麼意思 利弊) Latency Numbers Every Programmer Should Know https://gist.github.com/jboner/2841832 https://www.youtube.com/watch?v=-W9F__D3oY4 http://ninefu.github.io/blog/Harvard_CS75_Notes/ http://highscalability.com/blog/2016/1/11/a-beginners-guide-to-scaling-to-11-million-users-on-amazons.html http://www.aosabook.org/en/distsys.html https://github.com/checkcheckzz/system-desig...

面試技術

https://blog.csdn.net/jackfrued/article/details/44921941 https://wiki.jikexueyuan.com/project/java-collection/hashset-and-hashmap.html https://yubin551.gitbook.io/java-note/basic_java_programming/datatype/primitivedatatypes 1. 面向对象的特征有哪些方面? 2. 單精度 雙精度 單精度是這樣的格式,1位符號,8位指數,23位小數。 雙精度是1位符號,11位指數,52位小數。 Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean; 7. int和Integer有什么区别? wrapper class 原始类型: boolean,char,byte,short,int,long,float,double 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double 8. HashCode 23. 抽象类(abstract class)和接口(interface)有什么异同? 创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。 多線程 等待池 鎖池 https://blog.csdn.net/weixin_42504145/article/details/85329386 資料庫 排他鎖 序列化 java https://matthung0807.blogspot.com/2019/01/java-serializedeserialize.html InputStream OutputStream writer reader https://blog.csdn.net/qq_31617121/article/details/79110699 XML文档定义分为DTD和Schema两种形式 事務 Statement和PreparedStatement 事务的ACID 首先需要知道的是,只有存在并发数据访问时才需要事务。当多个事务访问同一数据时,可能会存在5类问题,包括3...

面試

http https ssl憑證 自己先用 OpenSSL產生 CSR(憑證簽署要求 )和私鑰給CA,CA返回公鑰和憑證 tls 1.0 1.1 1.2 1.3 SSL 1.0、2.0和3.0 solid  grasp data structure algorithm design pattern SOA和微服务架构的区别? 提出 MicroService 概念的Martin Fowler 也说过,“我们应该把 SOA 看作微服务的超集”,也就是说微服务是 SOA 的子集。 https://www.zhihu.com/question/37808426/answer/536875376 容器编排、APM、CI/CD(持续集成/持续交付)、自动化测试等 APM = application performance monitoring 三向交握 (1)用戶端發送一個帶SYN標誌的TCP報文到伺服器。這是三向交握過程中的報文1。 (2) 伺服器端回應用戶端的,這是三向交握中的第2個報文,這個報文同時帶ACK標誌和SYN標誌。因此它表示對剛才用戶端SYN報文的回應;同時又標誌SYN給用戶端, 詢問用戶端是否準備好進行資料通訊。 (3) 客戶必須再次回應服務段一個ACK報文,這是報文段3。 註:因為TCP是全雙工系統的,其實正常的時候,是需要雙方通道都要測試是否開啟成功才行,然而因為在第二次握手的時候,伺服器不僅發送了確認報文,而且還發送了要與用戶端相關的報文SYN,詢問用戶端是否準備資料通訊,這樣就省了一個報文的發送。  四次揮手 (1) TCP用戶端發送一個FIN,用來關閉客戶到伺服器的資料傳送(報文段4)。 (2) 伺服器收到這個FIN,它發回一個ACK,確認序號為收到的序號加1(報文段5)。和SYN一樣,一個FIN將佔用一個序號。 (3) 伺服器關閉用戶端的串連,發送一個FIN給用戶端(報文段6)。 (4) 客戶段發回ACK報文確認,並將確認序號設定為收到序號加1(報文段7)。  https://topic.alibabacloud.com/tc/a/interview-frequently-questions-tcp-three-times-handshake-and-four-times-handshake_8_8_20192...

架構名詞

關鍵字: controller model view data object interaction context event ddd dci use case domain service domain object domain application service domain event bounded context context map aggregate modules 不同的bounded context可視為不同的團隊 統一模型並不是很好,因為用一個模型來統治它們是一個壞主意,我們清楚地明白我們需要有不同的背景,通過擁有不同的背景,模型 可以生活在上下文中並自由進化 驗證在哪邊做,分成兩種,一個是服務外,一個是服務內,誰擁有資料誰就做驗證,如果是牽涉到資料庫查詢確認id是否存在要在服務外,若是服務內參數則在服務內。

git commit 類型

features. 功能 fix 修正 style 代碼格式 refactor 重構 docs 文件 perf 效能 chore  其他不重要的 extend 擴展