tag:blogger.com,1999:blog-78328182024-03-08T01:59:55.718+08:00jessewth's blog社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.comBlogger175125tag:blogger.com,1999:blog-7832818.post-40718579105663090502022-12-12T16:59:00.004+08:002022-12-12T17:03:13.895+08:00軟體工程的重要的指標簡單整理一下今天看到的這篇文章, 未來可以用指標來改善團隊狀況。
-----
<b>軟體工程的重要的指標</b>
<b>DORA 指標 (DevOps Research Assessment)</b>
1. 部署頻率: 產品多快發佈出去
2. 投入到交貨的時間 (Lead-Time For Change): 需求多快可以給客戶
3. 變更失敗率: 部署後造成線上異常的頻率, 也可以視為 Hotfix 次數 / 部署次數
4. 恢復服務時間: 從故障到恢復需要的時間
可觀察部署的摩擦系數及產品變更的可靠性。
<b>SRE 指標 (Site Reliability Engineering Metrics)</b>
1. 服務水平指標 (SLI): 決定服務水平的數據, 例如回應時間、失敗/請求比例 (error rates)
2. 服務水平目標 (SLO): 對每一項 SLI 定義目標, 例如一個月內, P99 的回應時間在 200 毫秒內。
3. 服務級別協議 (SLA): 對客戶宣告基於 SLO 的商業承諾, 若沒有達到則有罰則。
團隊應該要關注在 SLI & SLO 的關係, 什麼樣的指標代表服務水平, 例如電商可能會包括交易成功率跟每秒成單數量。
<b>錯誤預算 (Error budgets)</b>
- 這可能是基於 SLO 的指標來決定; 例如站台一個月內的可用性是 99%, 代表有 1% 的錯誤率可以消耗。 如果在每個月的前2次部署錯誤率升到 0.7%, 那代表你接下來的部署只剩下 0.3% 錯誤率可以花。如此花光了或到了臨界值, 團隊應該停止部署, 直到找到錯誤率升高的原因為止。 這樣可以機械式的將把可靠性放在新功能交付的前面。
<b>苦勞指數 (Percentage toil-work)</b>
- 例如維運人員的工作, 有 50% 在用工人智慧處理, 應該就將工作自動化。
<b>流動時間 (Flow time)</b>
- 有點像價值流, 計劃中工作應該都要算在內, 以此可以看出有多少需求是提出後大半年才排進年度計劃或交到團隊手上。
<b>流量分配</b>
- 定義每個工程階段花費時間的比例, 例如把整體的價值流程圖拉出來, 可看出團隊花在測試及提高可靠性上的時間分配有多少。
<b>PR lead-time & rework</b>
- PR lead-time: PR 開出後到被 merged 的時間
- PR rework: PR 審核後的修改次數
可以看出團隊基於 PR 的工作流程卡關的程度, 如果時間花在讓 PR 被 merged 的成本很高, 應該在發出 PR 前就提前進行討論。
<b>錯誤日誌量</b>
- 應該要觀察每個服務寫出來的 Log 數, 如果要靠寫 Log 才能幫助釐清似乎也不是個健康的做法, 錯誤日誌應該在真正異常的情況才做記錄。
<b>團隊健康/心理安全</b>
- 每季或每月進行匿名的心理安全調查, 有助於發現一些風險及警告信號。
<b>結論</b>
- 指標用於需要改善的地方
- 指標做為預警制
- 團隊自己跟自己比
<b>不要用在</b>
- 把指標落到個別開發人員身上
- 小心團隊之間的比較
- 根據指標對團隊或個人排名
來源: https://chaordic.io/blog/software-engineering-metrics-that-matter/?utm_source=techleaddigest&utm_medium&utm_campaign=1447社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-29017073692615582362020-10-07T17:29:00.002+08:002020-10-07T17:30:33.359+08:00解決本機的 DynamoDB 寫入權限問題## docker-compose.yml
```
version: "3"
volumes:
dynamodb-data:
external: true
services:
dynamodb-local:
image: amazon/dynamodb-local
ports:
- "8000:8000"
command: ["-jar", "DynamoDBLocal.jar", "-sharedDb", "-dbPath", "./data"]
volumes:
- dynamodb-data:/home/dynamodblocal/data
```
## use docker-compose
```
docker-compose up -d
```
## login your docker container
```
docker exec -u root -t -i <your_docker_id> /bin/bash
```
## change your docker container database file permission
```
chmod a+rw /home/dynamodblocal/data
```
refer: https://stackoverflow.com/questions/41221532/docker-volume-need-permissions-to-write-to-database社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-62645804575929670262020-06-15T08:57:00.000+08:002020-06-15T08:57:20.632+08:00用 PowerShell 找出 Windows Task Schedule 裡超過時間的排程```
Get-ScheduledTask | ? State -eq Running | Get-ScheduledTaskInfo | % {
$lastRunTime = [datetime]::parse($_.LastRunTime)
$lastRunTime
$ts = New-TimeSpan -Start $lastRunTime -End (Get-Date)
$ts.Minutes
if ($ts.Minutes -gt 10) {
Write-Host $_.TaskName
Write-Host "Running over 10 minutes!!"
}
}
```社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-5631551635371940392019-09-04T08:54:00.003+08:002019-09-04T08:54:54.176+08:00T-SQL 語法風格在討論 coding style 時, 有提到 T-SQL 是否也有語法風格規範?
找了幾個網路的文章, 在此列表做為記錄, 因為目前主要是使用微軟的 MSSQL, 自然也要附上 MSDN 的文章做為參考。
- [Transact-SQL 語法慣例 (Transact-SQL)](https://docs.microsoft.com/zh-tw/sql/t-sql/language-elements/transact-sql-syntax-conventions-transact-sql?view=sql-server-2017)
- [SQL樣式指南 · SQL Style Guide](https://www.sqlstyle.guide/zh-tw/)社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-4500949407210046472019-03-11T09:06:00.000+08:002019-03-11T09:06:59.771+08:00Command line recycle IIS Application Pool## Use appcmd
### List application pool (find the apppool name)
```
C:\Windows\System32\inetsrv\appcmd.exe list apppool
==== the result ====
APPPOOL "DefaultAppPool" (MgdVersion:v4.0,MgdMode:Integrated,state:Started)
APPPOOL "Classic .NET AppPool" (MgdVersion:v2.0,MgdMode:Classic,state:Started)
APPPOOL ".NET v2.0 Classic" (MgdVersion:v2.0,MgdMode:Classic,state:Started)
APPPOOL ".NET v2.0" (MgdVersion:v2.0,MgdMode:Integrated,state:Started)
APPPOOL ".NET v4.5 Classic" (MgdVersion:v4.0,MgdMode:Classic,state:Started)
APPPOOL ".NET v4.5" (MgdVersion:v4.0,MgdMode:Integrated,state:Started)
```
### Recycle the application pool
```
C:\Windows\System32\inetsrv\appcmd.exe recycle apppool ".NET v2.0 Classic"
==== the result ====
".NET v2.0 Classic" successfully recycled
```社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-94079761092157782019-03-04T08:50:00.000+08:002019-03-04T08:54:38.222+08:00幾個可以幫助新創業務的線上服務<div class="WordSection1">
<div class="MsoNormal">
<span lang="ZH-TW" style="font-family: "pmingliu" , serif;">內容取自</span> Producthunt</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
===============================</div>
<div style="line-height: 18.75pt;">
<span style="font-family: "segoe ui" , sans-serif; font-size: 11.5pt;">"What's a tool that changed your life?" - us to freelancers <a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/4/oriNsqaq0viEuUvPX3FMLg/aHR0cHM6Ly90d2l0dGVyLmNvbS9Qcm9kdWN0SHVudC9zdGF0dXMvMTEwMDQ1NTk1OTIyOTYxNjEyOA" target="_blank">on Twitter yesterday</a>. <br /><br />Why we think this is an important question: freelancing often means unchartered territory. When you work for yourself, it's up to you to find clients, lead projects, manage payments, find insurance, get dressed every day, etc. But freelancing as a career option is on the rise — reports predict that a majority of the U.S. workforce will be freelance by 2027. <br /><br />Want that life? Here are some of the apps that freelancers are currently using: <br /><br /><a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/5/6jJEK8aCe_UdH49lE6eH1w/aHR0cHM6Ly93d3cucHJvZHVjdGh1bnQuY29tL3Bvc3RzL3RoZS1uZXctZnJlc2hib29rcz91dG1fY2FtcGFpZ249MjU0NF8yMDE5LTAyLTI2JnV0bV9tZWRpdW09ZW1haWwmdXRtX3NvdXJjZT1Qcm9kdWN0K0h1bnQmdXRtX3Rlcm09ZWRpdG9yaWFs" target="_blank">Freshbooks</a> for getting paid </span><span style="font-family: "segoe ui" , sans-serif; font-size: 11.5pt;"><br /><a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/6/NmozLVY1IqnPkK19GZpibQ/aHR0cHM6Ly93d3cucHJvZHVjdGh1bnQuY29tL3Bvc3RzL3NsYWNrP3V0bV9jYW1wYWlnbj0yNTQ0XzIwMTktMDItMjYmdXRtX21lZGl1bT1lbWFpbCZ1dG1fc291cmNlPVByb2R1Y3QrSHVudCZ1dG1fdGVybT1lZGl0b3JpYWw" target="_blank">Slack</a> for communication </span><span style="font-family: "segoe ui" , sans-serif; font-size: 11.5pt;"><br /><a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/7/yru66F1S9qKoj87JhmzVQg/aHR0cHM6Ly93d3cucHJvZHVjdGh1bnQuY29tL3Bvc3RzL25vdGlvbi0yLTA_dXRtX2NhbXBhaWduPTI1NDRfMjAxOS0wMi0yNiZ1dG1fbWVkaXVtPWVtYWlsJnV0bV9zb3VyY2U9UHJvZHVjdCtIdW50JnV0bV90ZXJtPWVkaXRvcmlhbA" target="_blank">Notion</a> for an all-in-one workspace </span><span style="font-family: "segoe ui" , sans-serif; font-size: 11.5pt;"><br /><a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/8/whGkWyAyqwzMChKGyyfMdA/aHR0cHM6Ly93d3cucHJvZHVjdGh1bnQuY29tL3Bvc3RzL3dlYmZsb3c_dXRtX2NhbXBhaWduPTI1NDRfMjAxOS0wMi0yNiZ1dG1fbWVkaXVtPWVtYWlsJnV0bV9zb3VyY2U9UHJvZHVjdCtIdW50JnV0bV90ZXJtPWVkaXRvcmlhbA" target="_blank">Webflow</a> for web design </span><span style="font-family: "segoe ui emoji" , sans-serif; font-size: 11.5pt;">✍</span><span style="font-family: "segoe ui" , sans-serif; font-size: 11.5pt;"><br /><a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/9/TGoWcCcGYsODRs4TATHxJQ/aHR0cHM6Ly93d3cucHJvZHVjdGh1bnQuY29tL3Bvc3RzL3FsZWFybHktMz91dG1fY2FtcGFpZ249MjU0NF8yMDE5LTAyLTI2JnV0bV9tZWRpdW09ZW1haWwmdXRtX3NvdXJjZT1Qcm9kdWN0K0h1bnQmdXRtX3Rlcm09ZWRpdG9yaWFs" target="_blank">Qlearly </a>as a tabs manager</span><span style="font-family: "segoe ui" , sans-serif; font-size: 11.5pt;"><br /><a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/10/tzP03VcUx1oJohikc6I65w/aHR0cHM6Ly93d3cucHJvZHVjdGh1bnQuY29tL3Bvc3RzL251enplbC0yLTA_dXRtX2NhbXBhaWduPTI1NDRfMjAxOS0wMi0yNiZ1dG1fbWVkaXVtPWVtYWlsJnV0bV9zb3VyY2U9UHJvZHVjdCtIdW50JnV0bV90ZXJtPWVkaXRvcmlhbA" target="_blank">Nuzzel</a> for news monitoring</span><span style="font-family: "segoe ui" , sans-serif; font-size: 11.5pt;"><br /><a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/11/TlNLnlewTHavfilFnzdwBQ/aHR0cHM6Ly93d3cucHJvZHVjdGh1bnQuY29tL3Bvc3RzL3Vuc3BsYXNoLTUtMD91dG1fY2FtcGFpZ249MjU0NF8yMDE5LTAyLTI2JnV0bV9tZWRpdW09ZW1haWwmdXRtX3NvdXJjZT1Qcm9kdWN0K0h1bnQmdXRtX3Rlcm09ZWRpdG9yaWFs" target="_blank">Unsplash</a> for images</span><span style="font-family: "segoe ui" , sans-serif; font-size: 11.5pt;"><br /><a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/12/g7u6KkArR13hKe0mqnWRTw/aHR0cHM6Ly93d3cucHJvZHVjdGh1bnQuY29tL3Bvc3RzL3RoaW5ncy0zLTA_dXRtX2NhbXBhaWduPTI1NDRfMjAxOS0wMi0yNiZ1dG1fbWVkaXVtPWVtYWlsJnV0bV9zb3VyY2U9UHJvZHVjdCtIdW50JnV0bV90ZXJtPWVkaXRvcmlhbA" target="_blank">Things</a> for managing tasks</span><span style="font-family: "segoe ui" , sans-serif; font-size: 11.5pt;"><br /><a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/13/-UoiR3rKoHOqeiq_UvwKFA/aHR0cHM6Ly93d3cucHJvZHVjdGh1bnQuY29tL3Bvc3RzL3Bhc3RlbC0zP3V0bV9jYW1wYWlnbj0yNTQ0XzIwMTktMDItMjYmdXRtX21lZGl1bT1lbWFpbCZ1dG1fc291cmNlPVByb2R1Y3QrSHVudCZ1dG1fdGVybT1lZGl0b3JpYWw" target="_blank">Pastel</a> for feedback and questions</span><span style="font-family: "segoe ui emoji" , sans-serif; font-size: 11.5pt;">❓</span><span style="font-family: "segoe ui" , sans-serif; font-size: 11.5pt;"><br /><a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/14/cM9JnMkuTgyBAjV8a2G59A/aHR0cHM6Ly93d3cucHJvZHVjdGh1bnQuY29tL3Bvc3RzLzFwYXNzd29yZC03LTAtZm9yLWlvcz91dG1fY2FtcGFpZ249MjU0NF8yMDE5LTAyLTI2JnV0bV9tZWRpdW09ZW1haWwmdXRtX3NvdXJjZT1Qcm9kdWN0K0h1bnQmdXRtX3Rlcm09ZWRpdG9yaWFs" target="_blank">1Password</a> for security</span><span style="font-family: "segoe ui" , sans-serif; font-size: 11.5pt;"><br /><a href="http://links.producthunt.com/lnk/BAAAAB1wI4UAAAYrsqQAAAd7MsEAAAAIijYAAAAAAAYklQBcdsvIvQ3-Xls_Q7SGcxMeGbfGzQAF1QU/15/z8syhlwXks_fsFEmoju-RQ/aHR0cHM6Ly93d3cucHJvZHVjdGh1bnQuY29tL3Bvc3RzL2FuZC1jby0zP3V0bV9jYW1wYWlnbj0yNTQ0XzIwMTktMDItMjYmdXRtX21lZGl1bT1lbWFpbCZ1dG1fc291cmNlPVByb2R1Y3QrSHVudCZ1dG1fdGVybT1lZGl0b3JpYWw" target="_blank">AND CO</a> for invoicing, expenses and proposals</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Sent from <a href="https://go.microsoft.com/fwlink/?LinkId=550986">Mail</a> for Windows 10<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
</div>
社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-45780488221064750132019-01-30T08:47:00.001+08:002019-01-30T14:00:48.156+08:0090% 症候群<div class=WordSection1><p class=MsoNormal><span lang=ZH-TW style='font-family:"PMingLiU",serif'>在進行大規模盤點專案時</span>, <span lang=ZH-TW style='font-family:"PMingLiU",serif'>有人跟我說</span><span lang=ZH-TW> </span>"<span lang=ZH-TW style='font-family:"PMingLiU",serif'>敏捷不能解這題</span>" "<span lang=ZH-TW style='font-family:"PMingLiU",serif'>你要用</span> water fall" "<span lang=ZH-TW style='font-family:"PMingLiU",serif'>你要列出總進度</span>, <span lang=ZH-TW style='font-family:"PMingLiU",serif'>目前進度</span>"</p><p class=MsoNormal><span lang=ZH-TW style='font-family:"PMingLiU",serif'>但最終結果都落入了</span>90% <span lang=ZH-TW style='font-family:"PMingLiU",serif'>症候群</span>, <span lang=ZH-TW style='font-family:"PMingLiU",serif'>沒有完全的結束</span></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span lang=ZH-TW style='font-family:"PMingLiU",serif'>要記住的是</span>:</p><ul style='margin-top:0in' type=disc><li class=MsoListParagraph style='margin-left:0in;mso-list:l0 level1 lfo1'><span lang=ZH-TW style='font-family:"PMingLiU",serif'>把工作拆小</span></li><li class=MsoListParagraph style='margin-left:0in;mso-list:l0 level1 lfo1'><span lang=ZH-TW style='font-family:"PMingLiU",serif'>工作只有二種狀態</span>: "<span lang=ZH-TW style='font-family:"PMingLiU",serif'>完成</span>" <span lang=ZH-TW style='font-family:"PMingLiU",serif'>跟</span><span lang=ZH-TW> </span>"<span lang=ZH-TW style='font-family:"PMingLiU",serif'>尚未開始</span>"</li><li class=MsoListParagraph style='margin-left:0in;mso-list:l0 level1 lfo1'><span lang=ZH-TW style='font-family:"PMingLiU",serif'>不要問</span><span lang=ZH-TW> </span>"<span lang=ZH-TW style='font-family:"PMingLiU",serif'>這個工作的進度到那了</span>?" <span lang=ZH-TW style='font-family:"PMingLiU",serif'>而是問</span><span lang=ZH-TW> </span>"<span lang=ZH-TW style='font-family:"PMingLiU",serif'>我們完成這個功能了嗎</span>?"</li></ul><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>https://www.mountaingoatsoftware.com/blog/why-agile-teams-put-so-much-emphasis-on-being-done-each-iteration?utm_source=drip&utm_medium=email&utm_campaign=Why+Agile+Teams+Put+So+Much+Emphasis+on+Being+Done+Each+Iteration</p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Sent from <a href="https://go.microsoft.com/fwlink/?LinkId=550986">Mail</a> for Windows 10<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div>社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-57491837766333924642018-12-07T08:46:00.000+08:002019-01-30T14:01:32.620+08:00常用 Git Command### Initialization
```
git clone git@bitbucket.org:jessewth/xxxxx.deployment.git
git flow init -f -d
git remote add upstream git@bitbucket.org:xxxxxi/nineyi.deployment.git
```
### Remove remote branch
```
git push origin --delete feature/develop_release feature/master_for_release
```
### Clean branch cache
```
git remote prune origin
git fetch --prune
```
reference: [Git: Remove information on branches that were deleted on origin](https://makandracards.com/makandra/6739-git-remove-information-on-branches-that-were-deleted-on-origin)
### Git tag
https://git-scm.com/book/en/v2/Git-Basics-Tagging
### 還原到未修改前的狀態
```
git reset --hard
```
### 還原到未修改前的狀態及刪除未 commit 的新檔
```
git clean -fd
```
##3 用 command line 看 git log
```
git log --oneline --decorate --all --graph
```
為了方便使用, 把上述 command 加入 alias, 命名為 git tree, 下次要用的時候, 直接打 git tree 即可
```
git config --global alias.tree "log --oneline --decorate --all --graph"
```
### 回復單一個檔案的變更
```
git checkout HEAD -- ../../ConnectionStrings.config
```
### Git log search keyword
```
git log -g --grep="vsts28270"
```社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-29386767811854093082018-12-06T09:13:00.003+08:002019-01-30T14:01:22.056+08:00Agile Tour Taipei - 2018 心得<div class="markdown-body container-fluid comment-enabled" id="doc" style="position: relative;">
<h2>
Section 1. 如果重來, 我會這樣導入持續測試</h2>
<h3>
什麼是持續測試?</h3>
持續測試是一個過程, 它將自動化測試放進軟體開發之中, 不斷的反覆進行, 以期儘早的業務風險的回饋。<br />
ref: <a href="https://zhuanlan.zhihu.com/p/44975945" rel="noopener" target="_blank">持续测试与自动化测试的区别是什么?</a><br />
<br />
<h3>
Automation Test 不是敏捷導入所要做的第一件事</h3>
<ul>
<li>應該先改 Test Flow</li>
<li>縮短回饋時間 Lead time, cycle time</li>
<li>了解流程全貎</li>
</ul>
<div>
<br /></div>
<h3>
在產品設計時就提供實例化規格</h3>
<h4>
Why?</h4>
<ul>
<li>因為每個人對文字的理解力不同</li>
<li>幫助每個人了解求</li>
</ul>
<h4>
How?</h4>
<ul>
<li>Example for Spec.</li>
<li>PM/PO/Team 的訓練</li>
</ul>
<div>
<br /></div>
<h3>
讓 User 做測試</h3>
這一點是有趣的地方,提到利用金絲雀部署 -> Monitor (建立指標) -> Feedback --> Fix<br />
<ul>
<li>與其卡在 QA 出不去, 不如讓使用者幫忙測試</li>
<li>金絲雀部署, 5% 的 user 也比整個 QA Team 還多</li>
<li>沒人用的功能, 錯了也沒人知道</li>
</ul>
<div>
<br /></div>
<h3>
用原生的測試框架</h3>
測試人員的技術與 Develop 重疊, 彼此能有正向的聯結 (減少 solio)<br />
<strong><br /></strong>
<br />
<h3>
ATDD</h3>
對 Develop Team 的技術及能力要求很高, 不容易做到<br />
目標先不對準 Live Documents, 而是做好 acceptance criteria<br />
<strong><br /></strong>
<br />
<h3>
Git Branch Flow</h3>
Git Flow 的問題是 Long-lived branches, 不利整合<br />
用 tunk branch 可以強迫團隊合併持續整合<br />
導入樂高建構法, 寫完什麼就 commit 什麼, Feature 如果不要發, 就藏在 debug mode 裡<br />
<br />
<h3>
持續測試的週期</h3>
<–需求–|--產品設計–|--開發–|--測試–|--監控結果–|--維護–><br />
<ol>
<li>需求階段: 測試人員參與討論</li>
<li>產品設計階段: 一起寫 user story, 用 example spec.</li>
<li>開發階段: 與 Developer 用共同語言的測試框架</li>
<li>測試階段: 自動化測試</li>
<li>監控結果: 建立監控指標, 每次發佈都有指標可以比較</li>
<li>維護階段: 建立回饋機制</li>
</ol>
<div>
<br /></div>
<h2>
Section 2. 從工程角度, 挖出產品風險</h2>
<h3>
讓團隊了解指標的意義</h3>
<ul>
<li>先視覺化業務的結果 (report, dashboard 像1111一樣)</li>
<li>建立指標 (了解 dashboard 上的數字高低對系統的意義是什麼)</li>
</ul>
平常時不監控, 事情發生就無感<br />
做這些事的過程:<br />
<blockquote>
經驗流程化 -> 流程工具化 -> 主動發現問題</blockquote>
<br />
<h3>
不要指望明星球員</h3>
<ul>
<li>明星球員離職對團隊影響大</li>
<li>明星球員在場, 團隊會依賴明星球員, 團隊不會成長</li>
</ul>
我想的是: 如果讓每個人都是備選的明星球員, 隨時都能補位?<br />
<br />
<h3>
吃狗食</h3>
<ul>
<li>自己的東西自己測試</li>
</ul>
QA 角色定位是指出測試不足之處, 不是幫 Developer 寫測試 code<br />
<strong><br /></strong>
<br />
<h3>
流程導入的建議</h3>
<ul>
<li>了解大家不用的原因</li>
<li>把門檻降低</li>
<li>大家願意之後, 刻意練習</li>
<li>同步大家的水平, 減少不必要的紛爭</li>
</ul>
<div>
<br /></div>
<h2>
Section 3. Agile UX</h2>
<h3>
設計帶來改變</h3>
設計用來協助解決 Fuzzy Problem ===> Innovative Solutions<br />
<br />
<h3>
1. Mind the Gap 全區思考, 留意間隙</h3>
<h4>
有意識的留意 Gap</h4>
<ul>
<li>Business vs User</li>
<li>MVP vs Holistic UX</li>
</ul>
<ul>
</ul>
MVP 也要是 end to end 的體驗<br />
如何消除 Gap?<br />
<ul>
<li>同理心之旅</li>
<li>溝通要二方都被尊重, 在對意見投票時, 留給 Stakeholder 較大的決策權, 避免被霸凌</li>
</ul>
<div>
<br /></div>
<h4>
辦 Workshop 的方式</h4>
<ul>
<li>為什麼辦?</li>
<li>對象是誰?</li>
<li>辦了之後, 可能會有什麼問題?</li>
</ul>
辦 Workshop 要成功的關鍵在前期規劃<br />
<br />
<h3>
2. Run with Brian 謀定而後動, 知止而有得</h3>
<ul>
<li>Discover & Define (Sprint 0, 用來探索)</li>
<li>Design & Deliver, 設計與開發像麻花捲, 前後 sprint 滾</li>
</ul>
<div>
<br /></div>
<h3>
3. Close the Loop 反覆打磨, 止於至善</h3>
<ul>
<li>持續得到回饋(讓外部 user 持續來用)</li>
<li>Real retro</li>
</ul>
<div>
<br /></div>
<h3>
幾個推薦的 Process or User Group</h3>
<ul>
<li><a href="http://www.aja-creative.com/zh_tw/">AJA’s Design Process</a></li>
<li><a href="http://www.uigathering.org/" rel="noopener" target="_blank">UI Gathering</a></li>
<li>IDEA for Kid</li>
</ul>
<div class="resize-sensor" dir="ltr" style="bottom: 0px; left: -10px; overflow: hidden; position: absolute; right: 0px; top: -10px; visibility: hidden; z-index: -1;">
<div class="resize-sensor-expand" style="bottom: 0; left: -10px; overflow: hidden; position: absolute; right: 0; top: -10px; visibility: hidden; z-index: -1;">
<div style="height: 100000px; left: 0px; position: absolute; top: 0px; transition: all 0s ease 0s; width: 100000px;">
</div>
</div>
<div class="resize-sensor-shrink" style="bottom: 0; left: -10px; overflow: hidden; position: absolute; right: 0; top: -10px; visibility: hidden; z-index: -1;">
<div style="height: 200%; left: 0; position: absolute; top: 0; transition: 0s; width: 200%;">
</div>
</div>
</div>
</div>
社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-40539162166680293552018-10-24T09:53:00.002+08:002018-12-07T08:41:58.092+08:00測試 JDBC driver on windows## 下載 Microsoft JDBC Driver for SQL Server
```
choco install sqljdbc -y
```
or 下載 Microsoft JDBC Driver for SQL Server
## Microsoft JDBC DRIVER 7.0 for SQL Server Sample code 路徑
```
C:\Program Files\Microsoft JDBC DRIVER 7.0 for SQL Server\sqljdbc_7.0\enu\samples\connections
```
## 修改範例程式: 連接 URL 範例
```
// Create a variable for the connection string.
String connectionUrl = "jdbc:sqlserver://<server>:<port>;databaseName=AdventureWorks;user=<user>;password=<password>";
```
## Build
```
javac .\ConnectURL.java
```
## Run Test
```
java -cp "C:\Program Files\Microsoft JDBC DRIVER 7.0 for SQL Server\sqljdbc_7.0\enu\mssql-jdbc-7.0.0.jre8.jar;." ConnectURL
```社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-92090683637834929312018-06-19T15:23:00.000+08:002018-06-19T15:25:35.148+08:00程序員的修煉之道 (The Pragmatic Programmer) 讀書心得 - CH2 注重實效的途徑<div class="markdown-body container-fluid" id="doc">
<h2 id="CH2-注重實效的途徑">
CH2 注重實效的途徑</h2>
程式開發也存在著一些普遍適用的想法和過程<br />
這一章就是在講這些<br />
<hr />
<h3 id="重複的危害">
重複的危害</h3>
<ul>
<li>你開發的系統需要維護</li>
<li>維護意味著要找到需要修改的地方</li>
<li>如果需要修改的地方散落各處會增加維護的難度</li>
<li>重複: 這不是你記不記得住的問題, 而是你什麼時候忘記的問題</li>
</ul>
<hr />
<h4 id="重複怎麼發生的">
重複怎麼發生的?</h4>
<hr />
<h5 id="強加的重複">
強加的重複</h5>
<ul>
<li>多重表示的訊息
<ul>
<li>Client-Server 的 Application, 在 Client 端會需要設計不同語言的呼叫端程式</li>
<li>瀏覽器大戰時, 要針對不同的瀏覽器寫相容的javascript</li>
</ul>
</li>
<li>用程式產生器去產生不同語言的程式碼</li>
</ul>
<div class="alert alert-info">
問題: 如果你是資安單位, 你設計了一個防範CSRF的底層, 但公司用的技術有PHP, <a href="http://asp.net/" target="_blank">ASP.NET</a>, JSP, 需要不同語言的函式庫, 你會怎麼做?</div>
<hr />
<ul>
<li>不好的程式碼就代表重覆, 程式碼寫一遍, 注釋再寫一遍
<ul>
<li>無法從程式碼看出設計意圖, 所以補上大量的注釋, 因此在修改程式碼時, 要一併修改注釋</li>
</ul>
</li>
<li>把程式碼寫的簡單易懂, 容易閱讀</li>
<li>你寫的程式不是給自己看的, 是寫給別人看的</li>
<li>好的程式就像一個好的笑話, 不用解釋就懂</li>
</ul>
<hr />
<ul>
<li>文件和程式碼的重複
<ul>
<li>寫完文件, 再寫程式, 程式修改了, 要回去改文件</li>
</ul>
</li>
<li>寫出活的文件 (Live Documents)</li>
<li><a href="https://ruddyblog.wordpress.com/tag/live-document/" target="_blank">Ruddy Lee 分享空間 - 活文件 Living Document</a></li>
</ul>
<div class="alert alert-info">
問題: 文件容易過期, 人腦也靠不住, 如何讓領域知識有效率的傳承?</div>
<hr />
<ul>
<li>語言特性的問題</li>
<li>重複會增加維護的成本時, 可能就需要去處理它</li>
</ul>
<div class="alert alert-info">
問題: Config 檔分成多個環境的版本是否是DRY?</div>
<hr />
<h4 id="無意的重複">
無意的重複</h4>
<ul>
<li>注意類別裡可以自動計算的 propertie</li>
<li>例如: 長度、重量、材積 … 等等</li>
</ul>
<hr />
<h4 id="無耐性的重複">
無耐性的重複</h4>
<ul>
<li>因為時間壓力, 或是為了方便, copy-past一段code再小部份的修改, 這反而造成了維護時的壓力 (code 看起來有87%像)</li>
<li>記住"預速則不達", 儘量用重構的方式處理</li>
</ul>
<div class="alert alert-info">
問題: 什麼時間是好的重構時機?</div>
<hr />
<h4 id="開發者之間的重複">
開發者之間的重複</h4>
<ul>
<li>重複開發相同的功能或底層 (台灣 vs 大馬 code base?)</li>
<li>太喜歡自己造輪子</li>
</ul>
<div class="alert alert-info">
問題: 在敏捷團隊中, 不鼓勵分層負責開發, 要如何管理重覆的問題?</div>
<!-- .element: class="fragment" data-fragment-index="1" -->團隊間或是開發者之間主動交流<br />
<!-- .element: class="fragment" data-fragment-index="2" -->讓別人容易找到你的東西<br />
<hr />
<h3 id="正交性">
正交性</h3>
<ul>
<li>非正交性的設計, 造成相依性過高, 容易改A壞B</li>
<li>編寫正交性的系統, 可以以得到二個主要的好處:
<ul>
<li>提高生產率</li>
<li>降低風險</li>
</ul>
</li>
</ul>
<img alt="Orthogonality" src="https://flylib.com/books/1/315/1/html/2/files/orthogonality.gif" /><br />
<hr />
<h4 id="提高生產率">
提高生產率</h4>
<ul>
<li>可以局部修改, 開發跟測試的時間降低</li>
<li>程式碼可以重用</li>
<li>減少重疊的功能, 透過組合就能提高生產率</li>
</ul>
<hr />
<h4 id="降低風險">
降低風險</h4>
<ul>
<li>有問題的程式碼可以被隔離</li>
<li>改動只限於局部範圍, 影響也是</li>
<li>測試更容易</li>
<li>不會被特定的組件、服務提供商或平台綁住</li>
</ul>
<hr />
<h4 id="項目團隊的正交性">
項目團隊的正交性</h4>
<ul>
<li>團隊裡任務有重疊, 責任就會劃分不清</li>
<li>Componet Team VS Feature Team?</li>
<li>團隊裡有不同的功能專家
<ul>
<li>定義好彼此的溝通介面</li>
</ul>
</li>
<li>人數愈多, 正性性愈差 <== 溝通成本上升</li>
<li>子團隊要不斷的交流</li>
</ul>
<hr />
<h4 id="設計">
設計</h4>
<ul>
<li>設計好組件時, 想看看改動時會影響多少模塊?</li>
<li>不要依賴你無法控制的事物
<ul>
<li>把電話號碼當成客戶的Identity ID</li>
</ul>
</li>
</ul>
<hr />
<h4 id="工具箱與庫">
工具箱與庫</h4>
<ul>
<li>引入第三方工具時, 注意保持正交性, 明智的選擇技術</li>
<li>面向切面導向程式設計(Aspect-Oriented Programming, AOP)</li>
</ul>
<div class="alert alert-info">
<ul>
<li>問題: 如何跟Nuget套件保持正交性?</li>
</ul>
</div>
<hr />
<h4 id="程式碼">
程式碼</h4>
<ul>
<li>保持解耦</li>
<li>避免用全域數據</li>
<li>避免編寫相似的函數</li>
<li>找機會進行重構</li>
</ul>
<hr />
<h4 id="測試">
測試</h4>
<ul>
<li>建構單元測試可以測試系統是否保時正交性</li>
<li>修bug的時候也是評估正交性的時機</li>
<li>改A壞B, 難以評估影響範圍也許就是因為系統沒有保持正交性</li>
</ul>
<div class="alert alert-info">
問題: 遇到難以重現的問題該如何處理?</div>
<hr />
<h4 id="文檔">
文檔</h4>
<ul>
<li>你應該可以顯著的改變外觀, 而不是改變內容</li>
<li>建議用Markdown語法</li>
</ul>
<hr />
<div class="alert alert-info">
問題: 你參與了一個專案, 當大家在不顧一切地做出改動時, 每一處改動好像都會造成別的東西出錯…<br />
為什麼會這樣? <img alt=":fire:" class="emoji" src="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/images/basic/fire.png" title=":fire:" /></div>
<hr />
<h3 id="可撤消性">
可撤消性</h3>
<ul>
<li>現實世界不斷的在變化</li>
<li>當你嚴重依賴某一事實, 就幾乎可以斷定它將變化</li>
<li>實現一種東西, 不會只有一種方式</li>
<li>不要被第三方服務供應商控制</li>
<li>把決策視為寫在沙灘上, 而不是刻在石頭上</li>
</ul>
<hr />
<h4 id="靈活的架構">
靈活的架構</h4>
<ul>
<li>維持架構、部署及服務供應商等領域的靈活性</li>
<li>無論你使用那種機制, 讓它可撤消</li>
<li>如果東西是自動添加的, 讓它可以被自動去除</li>
<li>讓你的代碼學會"搖滾"</li>
</ul>
<hr />
<a href="https://zh.wikipedia.org/zh-tw/%E8%96%9B%E5%AE%9A%E8%B0%94%E7%8C%AB" target="_blank">薛丁格貓</a><br />
決策會造成多個平行宇宙, 你的程式碼可以支援多少個未來?<br />
<hr />
<h3 id="曳光彈">
曳光彈</h3>
<h4 id="曳光彈-vs-原型制作">
曳光彈 vs 原型制作</h4>
<ul>
<li>曳光彈不是用過即扔 ==> 迭代開發, top-down 開發</li>
<li>原型制作對概念進行實驗 ==> LinqPad, 實驗性的 Console Application</li>
<li>先用原型確認曳光彈要往那個方向發射</li>
</ul>
<hr />
<h3 id="領域語言">
領域語言</h3>
<ul>
<li>Domain-specific language</li>
<li>可以用來當作捕捉用戶需求的一種方式</li>
<li>進一步讓它變規範, 變成可執行的代碼</li>
<li>感覺是為了甲方乙方確認規格使用, 應該有更好的方式?</li>
</ul>
<hr />
<h3 id="估算">
估算</h3>
<ul>
<li>確認可行性</li>
<li>解答的情境是什麼?</li>
<li>估算的單位是什麼?</li>
<li>估算的基礎來自經驗</li>
<li>建立系統模型, 找出相關的變因</li>
<li>分解</li>
<li>計算答案</li>
<li>追蹤你的估算能力</li>
</ul>
<hr />
<h4 id="估算專案進度">
估算專案進度</h4>
<ul>
<li>檢查需求</li>
<li>分析風險</li>
<li>設計、實現、集成</li>
<li>向用戶確認</li>
</ul>
基於被代開發的經驗, 提煉你原來對迭代的次數<br />
把改進的進度表當成迭代的一部份<br />
<hr />
<h4 id="在被要求進行估算時要說什麼">
在被要求進行估算時要說什麼?</h4>
<ul>
<li>延後決策</li>
<li>放慢估算的速度</li>
</ul>
<div class="alert alert-success">
寫日誌記錄你的估算能力</div>
</div>
社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-72894183444851348672018-06-19T15:22:00.002+08:002018-06-19T15:25:42.311+08:00程序員的修煉之道 (The Pragmatic Programmer) 讀書心得 - CH1 注重實效的哲學<div class="markdown-body container-fluid" id="doc">
<h2 id="CH1-注重實效的哲學">
CH1 注重實效的哲學</h2>
<hr />
<h3 id="1-我的源碼讓貓給吃了">
1. 我的源碼讓貓給吃了</h3>
<hr />
Provide Options, Don’t Make Lame Excuses<br />
提供各種選擇, 不要找蹩腳的藉口<br />
<ul>
<li>不要害怕暴露弱點, 不害怕承認無知或錯誤</li>
<li><!-- .element: class="fragment highlight-red" -->負責, 犯錯時勇於承諾</li>
<li>不要害怕提出要求, 也不要害怕承認你需要幫助</li>
</ul>
<a href="https://www.testwo.com/article/1120" target="_blank">這些藉口你聽過幾個?</a><br />
<hr />
<h3 id="2-軟件的熵">
2. 軟件的熵</h3>
<hr />
熵就是無序的狀態, 不要放任無序生長<br />
Don’t Live with Broken Windows<br />
不要容忍破窗戶<br />
<ul>
<li><!-- .element: class="fragment" data-fragment-index="1" -->看到一個問題修一個, 避免惡化</li>
<li><!-- .element: class="fragment" data-fragment-index="2" -->如果團隊的代碼十分漂亮, 你也不會想成為第一個弄髒的人</li>
</ul>
<hr />
挑戰<br />
<ul>
<li>說說看你的團隊裡的破窗何時產生的? 誰的決策? 你的反應是什麼?</li>
<li>分享一下團隊修理破窗的經驗</li>
</ul>
<hr />
<h3 id="3-石頭煮青蛙">
3. 石頭煮青蛙</h3>
<hr />
Be a Catalyst for Change<br />
做變化的催化劑<br />
你知道是對的, 也知道怎麼做, 那就做下去吧!<br />
請求原諒比獲得許可容易<br />
<hr />
Remember the Big Picture<br />
記住大願景<br />
<ul>
<li>要持續不斷的觀察週圍發生的事情, 而不是只有你自己在做的事</li>
<li>看見全貌</li>
<li>專注在目標</li>
<li>設檢核點</li>
<li>每次檢核都要確認有朝著目標前進</li>
</ul>
<hr />
挑戰<br />
<ul>
<li>當你在設法做催化劑時, 想想你在做石頭湯還是青蛙湯? 決策是主觀還是客觀?</li>
</ul>
<hr />
<h3 id="4-足夠好的軟件">
4. 足夠好的軟件</h3>
<hr />
<ul>
<li><!-- .element: class="fragment" data-fragment-index="1" -->能解決客戶問題的足夠好的軟體就可以了, 要知道世界上沒有完美的軟體</li>
<li><!-- .element: class="fragment" data-fragment-index="2" -->讓用戶參與, 使質量成為需求問題</li>
<li><!-- .element: class="fragment" data-fragment-index="3" -->讓用戶先使用, 早期取得回饋, 可以導向更好的解決方案</li>
<li><!-- .element: class="fragment" data-fragment-index="4" -->知道何時止步, 不要過度打磨</li>
</ul>
<hr />
<h3 id="5-你的知識資產">
5. 你的知識資產</h3>
<hr />
知識資產會過期, 要定期投資<br />
給自己訂目標<br />
<ul>
<li>定期為你的知識資產投資</li>
<li>多元化、管理風險、低買高賣、重新評估和平衡</li>
<li>每年學一種新語言</li>
<li>每季閱讀一本技術書</li>
<li>也要閱讀非技術書</li>
<li>上課、參與社群、試驗不同的環境、跟上潮流和上網學習</li>
</ul>
<hr />
把握學習的機會<br />
<ul>
<li>把找到答案視為對你個人的挑戰</li>
<li>怎麼知道學習有成果? 開始教別人</li>
<li>抓零碎的時間學習</li>
</ul>
<hr />
批判的思考<br />
<ul>
<li>盡信書不如無書</li>
<li>不要小看商業網路推薦的力量</li>
</ul>
<hr />
<h3 id="6-交流">
6. 交流</h3>
<hr />
<ul>
<li>我們花費很多時間在交流, 所以要把它做好</li>
<li>規劃你想要說的東西, 寫出大綱</li>
<li>了解你的聽眾要的是什麼</li>
<li>選擇對的時機交流</li>
<li>依你的聽眾選擇交流的風格</li>
<li>讓文檔美觀, 檢查拼寫, 先自動再手動</li>
<li>回覆他人, 讓他人有受尊重的感覺</li>
</ul>
</div>
社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-85592691079471283752018-06-19T09:00:00.001+08:002018-06-19T15:25:50.325+08:00程序員的修煉之道 (The Pragmatic Programmer) 讀書心得 - 序篇有些書的序我會跳過不看, 但這本書的序我強烈建議一定要看, 它寫了一相當有價值的東西。<br />
本書的英文書名叫:重視實效的程序員(Pragmatic Programmer)<br />
<br />
什麼是重視實效?
在現在這個快速變化的世界, 昨天的好架構明天可能就變成反模式, 程式語言及工具也推陳出新, 許多老的工程師會嘆跟不上時代, 或是在這行實在太累了, 永遠都要學習。
<br />
<br />
撇開終生學習這個高大上不談, 程式開發還是有些特性是不太會變的, 本書要講的就是這些可以幫助大家成為更好的程式設計師的一些方法。
<br />
<br />
什麼是重視實效? 意思是你不該局限于任何特定的技術, 而是應該擁有足夠廣博的背景及經驗基礎, 以讓你能在特定情況下選擇好的解決方案。
<br />
<br />
我喜歡這種書是因為你可以在任何時候回來翻它, 翻完後可以得到更多的靈感。<br />
<br />
<div class="markdown-body container-fluid" id="doc">
<h2 id="程式員的修煉之道---序">
程式員的修煉之道 - 序</h2>
<img alt="" src="https://i.imgur.com/Osy6LQd.png" /><img alt="" src="https://i.imgur.com/VgD5ORn.png" /><br />
<hr />
編程是一種技藝, 你每天都在創造小小的奇蹟。<br />
<img alt="" src="https://i.imgur.com/zR3DBoT.png" /><br />
<hr />
編程是艱難的工作, 不存在<!-- .element: class="fragment highlight-red" data-fragment-index="1" -->最佳解決方案這種東西<br />
<!-- .element: class="fragment" data-fragment-index="2" -->能夠存在的只是在某些特定情形下更為適宜的系統<br />
<hr />
注重實效<br />
<ul>
<li>
意思是你不該局限于<!-- .element: class="fragment highlight-red" -->任何特定的技術, 而是應該擁有足夠廣博的背景及經驗基礎, 以讓你能在特定情況下選擇好的解決方案。<br />
</li>
<li>
<!-- .element: class="fragment highlight-red" -->注重實效的程序員不僅要完成工作, 而且要完成得漂亮。<br />
</li>
</ul>
<hr />
注重實效的程序員有以下特徵<br />
<ul>
<li><!-- .element: class="fragment" data-fragment-index="1" -->早期的採納者/快速的改編者</li>
<li><!-- .element: class="fragment" data-fragment-index="2" -->好奇</li>
<li><!-- .element: class="fragment" data-fragment-index="3" -->批判的思考者</li>
<li><!-- .element: class="fragment" data-fragment-index="4" -->有現實感</li>
<li><!-- .element: class="fragment" data-fragment-index="5" -->多才多藝</li>
</ul>
<hr />
但, 最基本的特徵是<br />
<ul>
<li>Care About Your Craft 關心你的技藝</li>
<li>Think! About Your Work 思考! 你的工作</li>
</ul>
<hr />
挑戰<br />
<ul>
<li>在你做某件事情的時候思考你在做什麼。</li>
<li>對你每一天、每一次開發上所做的每一項決策做出批判評估。</li>
</ul>
<hr />
你在大型團隊中, 仍然可以是注重實效的個體<br />
是木匠、石匠、雕刻工和玻璃工之類的手藝人<br />
超越了純粹機械方面的一個整體<br />
<a href="https://www.blogger.com/A6V-MqGFRNeCgh5xDcsEew" target="_blank">軟體工藝的支柱</a>: Care、Learn、Practice、Share<br />
<hr />
它是一個持續的過程<br />
改善: 持續地做出許多的小改進<br />
豐田形學: Improvement Kata<br />
<hr />
<a href="http://disp.cc/b/796-avgM" target="_blank">台灣著名的鋼琴家「Pianoboy」高至豪</a><br />
<ul>
<li>你有什麼夢想?</li>
<li>如果你願意為了它,努力數十年而不停止</li>
<li>如果你願意努力推銷自己的夢想10年,既使遇到無數的否定和嘲諷還是願意前進</li>
<li>如果你願意堅信你的判斷,既使放棄穩定的薪水和工作,既使失敗,也願意</li>
<li>我相信大部分人,絕對會比我更成功。</li>
</ul>
</div>
社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-70351511849913380632018-06-06T11:26:00.000+08:002018-06-06T12:15:41.029+08:00Visual Studio 2017 找不到 .NET Framework 4.6.2<div id="doc" class="markdown-body container-fluid" style="position: relative;"><p>Visual Studio 2017 預設沒有裝 .NET Framework 4.6.2, 可以依以下方式安裝: 到 .NET SDKs for Visual Studio 下載 .NET Framework 4.6.2 Developer Pack 並安裝</p><p>或是用 choco command 安裝:</p><pre class="codeblock"><code>choco install netfx-4.6.2-devpack -y
</code></pre><p>參考: <a href="https://blogs.msdn.microsoft.com/benjaminperkins/2017/03/23/net-framwork-4-6-2-not-in-visual-studio-2017/" target="_blank">https://blogs.msdn.microsoft.com/benjaminperkins/2017/03/23/net-framwork-4-6-2-not-in-visual-studio-2017/</a></p></div>社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-24243485489111595302018-04-24T18:43:00.000+08:002018-06-06T12:20:17.154+08:00Vim 自動排版 Json 檔<div class="markdown-body container-fluid" id="doc" style="position: relative;">
有時候我們會遇到需要用 vim 去開啟 json file, 但如何用 vim 把 json 做排版呢?<br />
可以參考這篇文章的做法: <a href="https://coderwall.com/p/faceag/format-json-in-vim" target="_blank">Format JSON in vim</a><br />
我目前的作法是採用 nmap 的方式把指令寫到 .vimrc<br />
編輯你的 .vimrc, 我是用 windows 版的 vim, 所以 .vimrc 的位罝在:<br />
<pre class="codeblock"><code>C:\Program Files (x86)\vim\_vimrc'
</code></pre>
加入以下設定:<br />
<pre class="codeblock"><code>nmap =j :%!python -m json.tool<CR>
</code></pre>
下次再用 vim 開啟 json file, 就只要打 =j 就會自動幫你排版了<br />
<img alt="" src="https://i.imgur.com/isEMU6g.png" /></div>
社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-17256579382804830002018-03-27T18:19:00.002+08:002018-03-27T18:19:44.041+08:00何種鐵槌?何種鏈? 何等火爐煉你的髓?何種鐵槌?何種鏈?<br />
何等火爐煉你的髓?<br />
<br />
威廉.布萊克 〈老虎〉(The Tyger)<br />
這是在圖書館翻書時看到的,我對外國文學沒有研究,上網查了一下,這首詩的意境似乎是在表達上帝與魔鬼的關係,但我單純看到這二句時,關連到的反而是軟體工匠道德聲明裡的 Practice .<br />
<br />
軟體工匠道德聲明是 Jason Gorman 分享在 Google 的 software craftsmanship 討論群組裡的簡短聲明,他認為做為一個軟體工匠,需要一個簡潔的口號讓每個從事軟體開發的人員更重視自己的工作及產品。全文是 We Care, We Learn, We Practice, We Share.<br />
<br />
其中的 Practice 指的是要成為一個合格的軟體工匠,需要不斷的練習,練習把工作做好,練習專注,並測量你練習後的成果。<br />
<br />
這是一段持續且艱苦的過程,透過不斷的練習內化所學到的知識,讓這些軟體開發的力量變成肌肉記憶,直到變成一個高效率的程式人員。<br />
<br />
你會需要思考,我如何練習?我找了那些資源?我練習的成果是什麼?能不能像鐡槌一樣的磨練自己的技能?能不能鏈住自己想要放棄的想法,讓自己投入試煉的火爐而成為一隻二眼炯炯有神的老虎?<br />
<br />
老虎在生物界裡是一個強大的象徵。自然界裡只有弱小的動物會聚集在一起,把自己藏在群體裡依靠大家生活下來,就像羊群或牛群;反之,強大的生物幾乎不必靠群體就能活,可以獨來獨往,例如老虎。<br />
<br />
身為一個程式人員,應該期許自己成為一隻老虎,不是說你不需要靠團隊合作來完成工作,而是你的技能被訓練到足以應付各種的狀況,就算是一個團隊,也會是一群老虎的團隊。<br />
<br />
威廉.布萊克的 The Tyger 全文如下 (有人說詩不能翻譯,所以我不想翻… XD)<br />
<br />
Tyger Tyger, burning bright,<br />
In the forests of the night;<br />
What immortal hand or eye,<br />
Could frame thy fearful symmetry?<br />
<br />
In what distant deeps or skies.<br />
Burnt the fire of thine eyes?<br />
On what wings dare he aspire?<br />
What the hand, dare seize the fire?<br />
<br />
And what shoulder, & what art,<br />
Could twist the sinews of thy heart?<br />
And when thy heart began to beat,<br />
What dread hand? & what dread feet?<br />
<br />
What the hammer? what the chain,<br />
In what furnace was thy brain?<br />
What the anvil? what dread grasp,<br />
Dare its deadly terrors clasp!<br />
<br />
When the stars threw down their spears<br />
And water’d heaven with their tears:<br />
Did he smile his work to see?<br />
Did he who made the Lamb make thee?<br />
<br />
Tyger Tyger burning bright,<br />
In the forests of the night:<br />
What immortal hand or eye,<br />
Dare frame thy fearful symmetry?社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-78506301815408153272017-04-07T09:09:00.001+08:002018-06-06T12:20:44.568+08:00Console Application在64bit機器上卻以32bit執行?<div id="doc" class="markdown-body container-fluid" style="position: relative;"><p>可能有人有疑問, 我建置時我明明"方案平台"選擇的是"Any CPU", 但為什麼在64bit的機器上, 卻沒有
預設走64bit呢?</p><p>以下程式為例:</p><pre class="codeblock"><code>using System;
namespace TestConsole
{
class Program
{
static void Main(string[] args)
{
if (IntPtr.Size == 4)
{
Console.WriteLine("現在跑在x86機器上");
}
else if (IntPtr.Size == 8)
{
Console.WriteLine("現在跑在x64機器上");
}
Console.Read();
}
}
}
</code></pre><p>印出的結果:<br>
現在跑在x86機器上</p><p>但是我明明是64位元的機器啊~~<br>
<img src="https://i.imgur.com/MLymD7i.png" alt=""></p><p>原來, Visual Studio的組態設定上, 預設會將"建議使用32位元" 打勾, 建置時就變成以32位元執行了, 所以, 如果日後有新增新的
組態設定 (e.g. QA, Prod環境), 記得也要檢查這部份哦<br>
<img src="https://i.imgur.com/Y4wbGC8.png" alt=""></p></div>社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-78812596356829014362017-02-15T13:17:00.002+08:002018-04-24T19:22:46.860+08:00NuGet package source設定<br />
建置Jenkins的時候, 如果有自建的NuGet Server, 在建置CI Job時會因為找不到NuGet Server而Build失敗, 通常我們會在Jekinkes上裝Visual Studio然後設定完NuGet的Package Source後, 再重新建置就會成功<br />
<br />
但這裡有個方法可以解決這個問題<br />
<br />
到Jenkins主機上, 在%ProgramData%\NuGet\下, 新增NuGetDefaults.config, 把自建的NuGet Server加進去就OK了 <br />
<br />
PS C:\ProgramData\nuget> Get-ChildItem .\NuGetDefaults.config | select fullname<br />
FullName<br />
--------<br />
C:\ProgramData\nuget\NuGetDefaults.config<br />
PS C:\ProgramData\nuget> cat .\NuGetDefaults.config<br />
<span class="php"><span class="hljs-meta">xml version=<span class="hljs-string">"1.0"</span> encoding=<span class="hljs-string">"utf-8"</span><span class="hljs-meta">?></span></span><br /><span class="hljs-tag"><<span class="hljs-name">configuration</span>></span><br /> <span class="hljs-tag"><<span class="hljs-name">packageSources</span>></span><br /><span style="background-color: yellow;"> <span class="hljs-tag"><<span class="hljs-name">add</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"mynuget"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"http://nuget.mynuget/nuget"</span> /></span></span><br /> <span class="hljs-tag"><<span class="hljs-name">add</span> <span class="hljs-attr">key</span>=<span class="hljs-string">"nuget.org"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"https://api.nuget.org/v3/index.json"</span> <span class="hljs-attr">protocolVersion</span>=<span class="hljs-string">"3"</span> /></span><br /> <span class="hljs-tag"></<span class="hljs-name">packageSources</span>></span><br /><span class="hljs-tag"></<span class="hljs-name">configuration</span>></span><br />PS C:\ProgramData\nugget></span><br />
<span class="php"><br /></span>
Updated:<br />
<br />
可以直接用 nuget command line 做設定<br />
<script src="https://gist.github.com/jessewth/bfc743f943e409c6d6598f3af8cbca0b.js"></script>
<br />社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-56786633143939773382017-02-07T12:00:00.003+08:002017-02-07T12:01:19.351+08:00Jenkins 權限設定災難復原<br />
<br />
有時候在安裝Jenkins的過程中, 會發生設定 jenkins credentials時, 沒有注意到權限是否設定正確, 就把Anonymous的權限拿掉, 造成所有user都無法再進到管理介面的悲劇...<br />
<br />
這時候, 有個簡單的處置辦法, 參考官方的文件: <a href="https://wiki.jenkins-ci.org/display/JENKINS/Disable+security">Disable security</a> 的作法<br />
<br />
1. 停止Jenkins Service<br />
2. 到$JENKINS_HOME 目錄(通常是C:\Program Files (x86)\Jenkins)<br />
3. 修改config.xml, 修改useSecurity為false. e.g. <usesecurity>false</usesecurity><br />
4. Restart Jenkins Service<br />
<br />
就可以看到權限變成開放給所有人, 再重新把權限加回去即可社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-37881812989508603042013-12-30T10:57:00.005+08:002013-12-30T11:03:38.333+08:00Objective-C 學習資源社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-27086760156701338932013-12-30T10:57:00.002+08:002013-12-30T11:03:26.545+08:00PowerShell 學習資源社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-24177336389512097962013-12-30T10:56:00.003+08:002013-12-30T11:03:03.879+08:00Microsoft .NET 學習資源<br />
<ol>
<li><span style="color: #404142;"><a href="http://msdn.microsoft.com/zh-tw/bb188199"><span style="font-family: Arial, Helvetica, sans-serif;">MSDN 訓練與認證資源 </span></a></span></li>
<li><span style="background-color: white; color: #68217a; font-family: 'Segoe UI Light', 'Segoe UI', Helvetica, Garuda, Arial, sans-serif;"><a href="http://msdn.microsoft.com/en-US/vstudio/default.aspx">#define VISUAL_STUDIO</a></span></li>
<li><a href="http://msdn.microsoft.com/en-us/vstudio/aa496123" style="font-family: 'Segoe UI Light', 'Segoe UI', Helvetica, Garuda, Arial, sans-serif;">.NET Framework</a></li>
<li><a href="http://msdn.microsoft.com/en-us/aa336522.aspx">ASP.NET</a></li>
</ol>
<br />
<div>
<br /></div>
社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-56693351096234415942012-12-13T15:09:00.003+08:002012-12-13T15:10:24.689+08:00PowerShell: How to group files by date using PowerShell?http://stackoverflow.com/questions/2520775/how-to-group-files-by-date-using-powershell<br />
<br />
<br />
<br />
Get-ChildItem \\10.10.10.1\myweb\inetpub\work\finished -Recurse | Group { $_.LastWr<br />
iteTime.ToString("yyyy-MM-dd hh") } | Sort Name | Format-Table Name, Count -auto<br />
社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-79474260306170181352012-12-13T09:51:00.002+08:002012-12-13T15:10:24.700+08:00PowerShell: 刪除目錄內小於某個日期的所有檔案Get-ChildItem \\10.10.10.1\data\upload\pic -Recurse | Select-Object FullName, LastWriteTime | Where-Object { $_.LastWriteTime -lt '2012/11/30 23:59:59' } | % { Remove-Item $_.FullName -Recurse -Force -Verbose }社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0tag:blogger.com,1999:blog-7832818.post-19915035417185043632012-11-21T18:04:00.000+08:002012-12-13T15:10:24.686+08:00Powershll 對於特殊符號目錄的處理參考資料:<br />
<br />
http://surroundingthecode.wordpress.com/2010/04/17/powershell-file-names-special-characters-frustration-eventually/<br />
<br />
<br />社會人士http://www.blogger.com/profile/17085871259993654904noreply@blogger.com0