--- lang: zh-tw title: '我們用什麼技術開發' tags: '看' --- 我們用什麼技術開發介紹 === <br> :crossed_swords::shield: 目前使用的開發技術介紹 ---  上圖就是把常用的技術分類為五個主題,本篇會依據這些主題進行講解,這五個主題基本上就是工程師的工作日常,也是常用的核心技術的大分類。 說實在的這樣分類涵蓋的範圍太廣,要聊的東西非常的多,但講太細又怕讀者會感到無聊,所以我們每一個主題所提到的內容都是**精簡**過的資訊,好處是可以快速理解一門技術,壞處則是只理解表面而已。 <br> :::success 每個技術可能會淺談到一點程式碼的應用,我認為帶點程式碼的語法,是為了讓讀者能夠在開發者的角度,去理解該技術能夠達到哪些目的,以及為什麼要使用它,**但不會去解釋過多的程式碼語法邏輯和規則**(~~*為了讓你繼續看下去,所以不能講太多*~~:joy: )。 ::: <br> ## 前端  前端指的是客戶端瀏覽**網頁**的部分,以 「HTML」、「CSS」、「JavaScript」技術開發。 <br> ### HTML<small>(**H**yper**T**ext **M**arkup **L**anguage,超文本標記語言)</small> 一個網頁的組成,最基本的東西,就是「HTML」。可以把「HTML」想像成一堆文字,並將不同文字的**區間**去做**標記**,來表達不同的意義,並藉由**瀏覽器**去呈現內容。 <br> 以下是一份文字稿:scroll:  以**人**:shrug:的角度來看,就上面的內容,看起來像在解釋某個理論的原理,以及它有哪些額外的命名。 就字面上看,大部分的人應該都能判斷出,第一行為某理論的**主題**,以及後面的理論**說明**,和此理論不同命名的**項目**。 <br> 試著把這份文字稿:scroll:丟進瀏覽器:desktop_computer:內 ```xml= 八二理論 定義:80% 的結果來自於 20% 的行動。 其他幾個不同的名稱: * 帕雷托法則 * 80/20 法則 (最常見 * 關鍵少數法則 * 因子稀疏法則 ``` <br> 以下是透過瀏覽器:desktop_computer: 解析後,網頁呈現的部分: <iframe height="300" style="width: 100%;" scrolling="no" title="純文字稿" src="https://codepen.io/KingLongWu/embed/jOvNVgR?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/KingLongWu/pen/jOvNVgR"> 純文字稿</a> by 吳進隆 (<a href="https://codepen.io/KingLongWu">@KingLongWu</a>) on <a href="https://codepen.io">CodePen</a>. </iframe> <br> 看得出與先前不同,以結構來看,都變成一行了,完全看不出來在講什麼,只是一行單純的文字,毫無結構可言。 <br> <br> > 人類:shrug:看文字稿,是可以直覺反應出文章結構,但瀏覽器:desktop_computer:沒辦法,也看不懂。 <br> <br> 然而為了讓瀏覽器看的懂,所以要在特定文字**區間**去做**標記**,來讓瀏覽器明白人類想表達的意義。 以下為文字稿轉換成「HTML」: ```xml= <h1>八二理論</h1> <p>定義:80% 的結果來自於 20% 的行動。</p> <h2>其他幾個不同的名稱:</h2> <ul> <li>帕雷托法則</li> <li>80/20 法則 (最常見)</li> <li>關鍵少數法則</li> <li>因子稀疏法則</li> </ul> ``` 經過「HTML」的標記: * 原本第一行的主題,轉換為==h1==大標題 * 後面的理論說明,轉換為==p==段落 * 緊接著轉換為==h2==次標題 * 最後的各個名稱,轉為==ul==、==li==清單 <br> 以下是透過瀏覽器解析後,網頁呈現的部分: <iframe height="300" style="width: 100%;" scrolling="no" title="文字稿轉HTML" src="https://codepen.io/KingLongWu/embed/JjaPEPb?default-tab=html%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/KingLongWu/pen/JjaPEPb"> 文字稿轉HTML</a> by 吳進隆 (<a href="https://codepen.io/KingLongWu">@KingLongWu</a>) on <a href="https://codepen.io">CodePen</a>. </iframe> <br> 就上面的呈現,可以看出大標題與次標題,皆有`粗體`、`字體較大`,清單的部份,幫你加上了`●`符號,並且每一個區段會幫你做好換行,這就是使用「HTML」的標記,讓瀏覽器讀懂後,而網頁上產生的變化。 <br> #### 補充重點 * HTML 常被人比喻為人的骨架 * HTML 用來將資料結構化(樹狀結構,有階層的關係),並使資料變的有意義 * HTML 是標記語言,不是程式語言(程式語言涵蓋判斷式、迴圈等語法) * HTML 要用大寫表示,不要用小寫 html 表示 * HTML 正確的使用標記,搜尋引擎的排名會更高 <br> --- <br> ### CSS<small>(**C**ascading **S**tyle **S**heets,階層式樣式表)</small> 負責處理「HTML」這份純文字檔在網頁上面的**視覺外觀**與**版面配置**,就是「CSS」。 大部分的運用情境,不外乎就是處理文字的大小、顏色、粗細、段落之間的間距、超連結底線是否拿掉、圖片大小、圖片圓角、物件的上下左右對齊、浮動、固定位置、動畫等。 <br> > 說穿了,「CSS」也是一份文字檔,也透過瀏覽器解析後,對「HTML」做樣式上的調整。 <br> 以上面的範例,再加上「CSS」後的效果: <iframe height="300" style="width: 100%;" scrolling="no" title="文字稿轉HTML加CSS" src="https://codepen.io/KingLongWu/embed/bGxbgJN?default-tab=result" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/KingLongWu/pen/bGxbgJN"> 文字稿轉HTML加CSS</a> by 吳進隆 (<a href="https://codepen.io/KingLongWu">@KingLongWu</a>) on <a href="https://codepen.io">CodePen</a>. </iframe> <br> *<small class="text-muted">可以將原本的結構重新編排,也可以添加一些色彩,或是簡單的互動</small>* <br> #### RWD<small>(**R**esponsive **W**eb **D**esign,響應式網站)</small> 更進階的「CSS」技術,可以延伸出一個新的名詞「RWD」。在不同的3C裝置(:tv:電視、:desktop_computer:電腦、:iphone:手機...),瀏覽同一份網頁時,都能有良好的呈現。 以往的網頁設計中,只使用**電腦**螢幕的**尺寸**做開發,缺點隨著手機的流行而增加。人們用手機瀏覽此類型的網頁時,會發現版型跑版,使文章不易閱讀,這時候就會透過手機放大、縮小、平移的功能,來拼湊前後文的脈絡。 <br> > 簡單的閱讀都有困難,怎麼可能留得住<s>(錢)</s>使用者 <br> 有些公司的網站行之有年,已有了一定程度的規模,此時若決定要導入「RWD」,搶救手機市場的使用者,必定是個大工程。 <br> > 當時的時空背景,進而延伸出一個做法,就是再開發一個**手機版的網站**。 <br> :desktop_computer:電腦版 https://ithelp.ithome.com.tw  :iphone:手機版 https://ithelp.ithome.com.tw/m  該網站就是透過程式技巧去分辨,當使用電腦則是去電腦的頁面,手機則進入手機的頁面。 注意到網址的差異,到手機版的網址最後面多一個`/m`,而這也是當時常見的處理方法。 <br> 不過這樣的做法,並不是最佳解,這樣會有幾個缺點: * 維護上要做兩次工 * 網址不同,SEO 排名不佳 <br> 所以越早定義系統方向,進而導入「RWD」,所花的時間成本越少。但也要考慮你的網站性質,是否適合開發成「RWD」,以下情境就是不太適合: 1. 呈現的資料內容密集,如大量表格或圖表顯示。 2. 網頁內容需要精確定位,如地圖。 3. 需要與使用者頻繁互動的功能,如滑動、拖曳,放大和縮小。 <br> #### 補充重點 * CSS 常比喻為膚色或衣服:shirt: * CSS 也是一個文字檔,只是因為瀏覽器,才給予了它價值 * 以電商為例,一個好的排版,能讓使用者願意花更多時間停留在上面;而一個亮眼的樣式按鈕,也能吸引使用者做出衝動性的消費 * RWD 是一種非常有用的技術,但它並不適合所有的網站,在選擇是否使用 RWD 之前,您應該考慮網站的需求和限制。 <br> --- <br> ### JavaScript<small>(通常縮寫為 **JS**)</small> 網頁的最後一項技術「JavaScript」,這是一門**易學難精**:zombie: 的程式語言,與其它程式語言相比,有著特別多的**例外**特性需要熟悉,而有了「JavaScript」的存在,使網頁能處理的事情變得更加廣泛。 一個好的網頁,與使用者之間的互動應該是良好的,而網頁只使用「HTML」和「CSS」的話,所帶給使用者互動性的**回饋**:thumbsup:,是遠比不上使用過「JavaScript」的網頁。 <br> 而互動式網頁所提供的功能舉例如下: * **即時**的新增、刪除、修改網頁上的內容或畫面 * 有階段性的去控制**引導**步驟 * 在適當的時機,**回應**描述資訊 * 觸發各類**事件**(點擊、雙擊、鍵盤事件、滑鼠事件...)與使用者互動 * ... <br> <br> **「JavaScript」程式碼範例:** <iframe height="500" style="width: 100%;" scrolling="no" title="JavaScript 練習" src="https://codepen.io/KingLongWu/embed/poZxXMy?default-tab=js%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/KingLongWu/pen/poZxXMy"> JavaScript 練習</a> by 吳進隆 (<a href="https://codepen.io/KingLongWu">@KingLongWu</a>) on <a href="https://codepen.io">CodePen</a>. </iframe> <br> <br> #### jQuery 現今三大框架[^框架]:crossed_swords: `Anguler`、`Vue`、`React` 底層都是用「JavaScript」設計出來的,不過學習曲線很高,有很多困難的因素需要去克服(例如開發環境的建立、熟悉新的語法、了解此框架語言的特性、以及與以往寫`code`風格大不相同,需要習慣等)。  <br> <br> <br> > 而今天公司若需要即戰力,則可以使用「jQuery」來代替, > 那麼什麼是「jQuery」呢? <br> <br> <iframe src="https://jquery.com" style="border: 0" width="100%" height="170" frameborder="0" scrolling="no"></iframe> ([jQuery官網](https://jquery.com)) <br> <br> 可以注意到官網 **Logo** 下方那串英文 > write less, do more,「*寫得更少,做的更多*」 <br> <br> 「JavaScript」是一門**命名**上較~~囉嗦~~:nauseated_face: 豐富的語言,它在語法、函式命名用較多單字組成,但不巧的是我們常用到的語法,通常都很冗長,而為了讓撰寫「JavaScript」變的**快速**有趣,於是「jQuery」就被一位工程師給開發出來。 而「jQuery」就是用來簡化「JavaScript」的一個**函式庫**,它封裝了重複性的功能,移除:x: 掉不必要的程式碼命名,讓撰寫「JavaScript」語言變得簡單、易讀、又好學(~~*考試都考滿分了呢!!*~~)。 <br> <br> **同上面的功能以「jQuery」撰寫的範例:** <iframe height="500" style="width: 100%;" scrolling="no" title="jQuery練習" src="https://codepen.io/KingLongWu/embed/MWBzWjg?default-tab=js%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/KingLongWu/pen/MWBzWjg"> jQuery練習</a> by 吳進隆 (<a href="https://codepen.io/KingLongWu">@KingLongWu</a>) on <a href="https://codepen.io">CodePen</a>. </iframe> <br> <br> <br> > 程式碼看起感覺沒有差太多,功能面也是沒有太大差異性, > 那讓我們把它丟到 word 裡面,去算它的字元數看看 <br> **兩邊程式碼字元數** | JavaScript | jQuery | |:----------:|:------:| | 855 個 | 626 個 | <br> 到了這邊應該可以感受到,確實可用更少的 `code` 來達到相同的功能,再如**事件**寫法的差異,要處理某件事情,我可以用更少的 `code` 完成,寫久了自然就會比別人更快做完案子:muscle:。 ```javascript= //JavaScript document.getElementById("demo").addEventListener("click", function() { //...略 }); //jQuery $("#demo").click(function() { //...略 }); ``` [^框架]: 遵循一定的規則去做程式碼的開發,以達到某些好處,並提高維護性 <br> #### Bootstrap <iframe height="300" style="width: 100%;" scrolling="no" title="Untitled" src="https://getbootstrap.com/docs/5.1/components/card/#body" frameborder="1" loading="lazy" allowtransparency="true" allowfullscreen="true"></iframe> ([Bootstrap官網](https://getbootstrap.com/docs/5.1/components/card/#body)) <br> 到了這邊不得不提到另一個前端元件庫,「Bootstrap」。 由 Twitter 的工程師開發,它針對「HTML」、「CSS」和「JavaScript」預先定義好語法,網頁常用到的各種功能的樣式,也處理了互動性的操作,且支援不同家**瀏覽器**相容性的問題,亦支援「**RWD**」的設計。 而它也同「jQuery」一樣地簡單、易學、靈活度高:angel: ,可快速開發完一個工整漂亮的網頁,不用特別花心思去設計樣式。 網路上大多找到的擴充套件(Web API),或是前端框架(`Anguler`、`Vue`、`React`),都有結合了「Bootstrap」的版本可以使用,這也降低不少找來的資源不相容的問題,是可以穩定的拿來做開發使用。 <br> <br> **一樣用上面的功能改成「Bootstrap」的範例:** <iframe height="500" style="width: 100%;" scrolling="no" title="Untitled" src="https://codepen.io/KingLongWu/embed/gOjQbjb?default-tab=js%2Cresult" frameborder="no" loading="lazy" allowtransparency="true" allowfullscreen="true"> See the Pen <a href="https://codepen.io/KingLongWu/pen/gOjQbjb"> Untitled</a> by 吳進隆 (<a href="https://codepen.io/KingLongWu">@KingLongWu</a>) on <a href="https://codepen.io">CodePen</a>. </iframe> <small class="text-muted">修改的過程很快,只要在「HTML」添加了「Bootstrap」原先定義好的樣式,加上官網提供的「HTML」模板,並對「jQuery」做些微調,即可得到看起來漂亮又工整的畫面。</small> <br> <br> > 感恩的心,感謝有你:congratulations: <br> 對於多數的工程師來說,用「CSS」去切版是件困難的事情,而設計出漂亮又合適的樣式又是另一項挑戰,更別提要納入「RWD」去做開發了,這些都是開發網頁初期,工程師們頭痛的問題,而「Bootstrap」的誕生,一次性的把問題通通解決掉,工程師們就可以專心在**商業邏輯**上。 <br> <br> #### 補充重點 * JavaScript 常比喻為人的大腦,給予思考、行動 * JavaScript 與 Java 兩個是不同的東西 * JavaScript 是在前端使用的程式語言,但也可透過 node.js 在後端執行 * 常引戰的議題 jQuery 是否該淘汰,轉而使用前端框架(Anguler、Vue、React),我的看法是 jQuery 短時間不會被淘汰,但使用在大專案上,後期會變得不好維護;所以框架的誕生,基本上是為了有彈性的維護,但為了好維護,而面臨的是一大堆規則約束,以及不同的開發模式,各有利弊視情況而定,只是目前大方向都是往框架靠齊。 * 大部分的工程師,對於畫面的設計是不太擅長的,而有了 Bootstrap 後,工程師們喜極而泣~~ <br> --- --- --- <br> ## 後端  後端指的是伺服器端用來處理(加工)資料的部分,主要負責資料要放在哪裡、怎麼放,以及怎麼取得。 <br> ### 程式語言 C#<small>(**C**-**S**harp)</small> 要了解 C# 這門程式語言,最好先從微軟的生態開始了解,比較能助於了解整個面向,後面在介紹這門程式語言可以做到什麼事。 <br> #### .NET 平台 :heart_eyes: 為微軟開發的一組技術和工具,可**建立**網頁或桌面程式、**部署**至 IIS 上和**運行**應用程式。 它的核心部分是 **.NET Framework、.NET Core**,以及開發工具(**Visual Studio**、**Visual Studio Code**)支援開發人員在 .NET 平台上進行開發。 <br> #### 開發框架函式庫 .NET Framework vs .NET Core :zany_face: | | .NET Framework | .NET Core | |:------------:| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **函式庫** | **Base class library**<br>提供**大量**的基本類別函式庫 | **Core library**<br>提供了和 .NET Framework **相似**的功能,並外加額外的特性 | | **平台** | 只能在 Windows 下使用 | 跨平台,可以在 Windows、macOS、Linux、iOS、Android 上執行 | | **開源** | 部分開源 | 開源 | | **版本** | .NET Framework 1.0 - 4.8.1 | .NET Core 1.0 - 3.1、.NET 5、.NET 6 | | **出土時間** | .NET Framework 1.0 於 **2002 年**發行 | 於 **2014 年**宣布要做跨平台框架 <br> **2016 年**釋出了 .NET Core 1.0 | | **線上資源** | 中、英文的資源較多 | 線上的資源較多原文,但近年中文的資源,有逐漸變多的趨勢 | | **未來走向** | .NET Framework 4.8.1 是**最後一版**,未來仍會有技術支援,及**安全性**更新,但不會再改版,也不會被 .NET 5 取代<br><br>官方建議如果是已使用 .NET Framework 開發的軟體,不需要轉移,但**新開發**則建議使用 .NET 6 或更高的版本做開發 | .NET 5 是 .NET Core 3.1 的下個版本,未來將會依照 .NET 5、6、7、8...一路發展下去<br><br>未來每年固定11月釋出**新版**,在 3.1 LTS 之後,**雙數**版號才是 LTS 版,故 .NET 5 非 LTS,明年的 .NET 6 才是 | | **使用準則** | 急著上線的系統可以使用<br>(*較擅長且多數情況都有解法*) | 追求工作技術突破可以使用<br>(*每年都有變化*) | <br> > .NET Core 3.1 的下一個版本命名跳過 4.0,目的在於**避免**與 .NET Framework 4.x 混淆,並且**拿掉** Core 並更名為 .NTE 5,而目前 .NET 5 號稱執行效能,比 .NET Framework 或 .NET Core 3.1 還要高出許多,又給了我們除了跨平台外,更要使用它的誘因 <br> #### .NET 總結 .NET 平台是一個超級大的**軟體的開發框架**,而 .NET Framework 是 .NET 平台的一個**實現**,專門使用在 Windows 平台;而隨著時代進步:earth_africa: ,微服務、容器化崛起,微軟開始搶占 Linux 等**跨平台**市場,所以推出了 .NET Core,而目前便以 .NET Core 為**核心**。 <br> #### C# 為 .NET 平台中的其中一種**程式語言**(其他還有 VB、F#),是一種由 C 和 C++ 延伸出來的物件導向的程式語言,並以 .NET Framework 作為基礎。 C# 發音為「C sharp」,在音樂:musical_note: 中「C♯」表示 C 升半音,為比 C 高一點的音節,且「#」形似 **4 個加號**,微軟藉助這樣的命名,以表示 C# 在一些語言特性方面,是 C++ 的提升的意思。 <br> 該程式語言特色為: * 語言風格相似 開發過 C、C++、Java 和 JavaScript 的工程師會感到熟悉,因為語法相似轉換語言成本較低 * 跨**語言** 只要是 .NET 框架的語言(VB、F#),程式碼都是可以共用的 * 跨平台 因為依賴於 .NET Framework 或 .NET core,所以你的選擇決定你能否跨平台 * 型別安全:sunglasses: 定義資料的類型,該是整數就是整數,該是字串就是字串,避免不同型別的資料,發生運算錯誤 * 物件導向 利用現實生活中的各類實體,去模仿它的狀態或特性,來組織程式面的邏輯架構 * 垃圾回收機制:poop:(Garbage Collection,GC) 管理和釋放物件的記憶體資源,工程師不用手動去釋放資源,它會自動將沒用到的資源做回收 <br> <br> 基本上 C# 有自己的版本線,並且每個版本都會和**某一版** .NET Framework、.NET Core 做搭配,並且也和**某一版** Visual Studio 共同釋出。  <br> <br> 只有 .NET Core 與 Visual Studio 的關係,可以注意到 .NET 6、.NET 8 為LTS  <br> <br> #### C# 可以開發的項目 ```graphviz digraph ".NET架構圖" { node[shape=Mrecord] rankdir=LR; subgraph cluster_level0{ label ="開發風格"; struct_MVC [label="MVC風格" fontcolor="#2196f3" color="#2196f3" shape=hexagon]; struct_RESTful [label="RESTful風格" fontcolor="#e91e63" color="#e91e63" shape=hexagon]; } subgraph cluster_level1{ label =".NET 平台"; fontsize=22; struct_CSharp [label="C#"]; struct_Core [label=".NET Core"]; struct_FK [label=".NET Framework"]; subgraph cluster_level2{ label ="開發框架"; fontcolor="#009688"; color="#009688"; style="bold"; struct_FKs [label=" Console Applications \n 主控台應用程式 | <f0> ASP.NET \n 網頁框架 | <f1> ASP.NET Web API \n HTTP 服務框架 | Windows Form \n 桌面應用程式框架 | Entity Framework \n 操作資料庫 ORM 框架 " height=4]; struct_Cores [label="Console Applications \n 主控台應用程式 | <f0>ASP.NET Core \n 網頁框架 | <f1> ASP.NET Core Web API \n HTTP 服務框架 | Windows Form .NET \n 桌面應用程式框架 | Entity Framework Core \n 操作資料庫 ORM 框架 " height=4]; } } struct_CSharp -> struct_FK [label="Windows 平台"]; struct_CSharp -> struct_Core [label="跨平台"]; struct_FK -> struct_FKs; struct_Core -> struct_Cores; struct_FKs:f0 -> struct_MVC [label=" " color="#2196f3"]; struct_FKs:f1 -> struct_RESTful [color="#e91e63"]; struct_Cores:f0 -> struct_MVC [color="#2196f3"]; struct_Cores:f1 -> struct_RESTful [color="#e91e63"]; } ``` <br> 從上圖`開發框架`可以看出,我們能使用**資料庫框架**去讀資料,並且可藉由**主控台、網頁、Web API、桌面程式**等框架,輸出讀到的內容,或者使用**原生**的**函式庫**(.NET Framework、.NET Core),處理郵件:email:發送、操作XML、操作檔案等,甚至可以透過**第三方套件**做更多事情(產生 Word 或 Excel、動態壓縮資料、資料格式轉換等)。 <br> 以下為用 Entity Framework,取得資料的語法範例 ```csharp= class Program { static void Main(string[] args) { // 建立資料庫連接 using (var context = new YourDbContext()) { // Linq 語法讀取資料 var results = from r in context.YourTable select r; foreach (var item in results) { Console.WriteLine("Column1: " + item.Column1); Console.WriteLine("Column2: " + item.Column2); // ... } } } } ``` <br> #### :hammer_and_wrench:兩者開發框架差異 .NET Framework 和 .NET Core 所使用的開發框架,命名上都只**差幾個單字**:sweat_smile: (`ASP.NET`、`ASP.NET Core`),但是在程式開發的面向來看,改變就不是差幾個單字可以輕鬆帶過的,以開發環境來說,若要開發 .NET 5,就需要額外安裝 .NET 5 所需要的執行環境([SDK](https://blog.darkthread.net/blog/install-dotnet-5-sdk/)),而要能 Run 在 IIS 上,又要安裝另一個模組([ASP.NET Core Hosting bundle](https://learn.microsoft.com/zh-tw/aspnet/core/host-and-deploy/iis/hosting-bundle?view=aspnetcore-5.0)),才可以部署。 <br> #### 以網頁開發框架繼續探討 在`ASP.NET`所使用的技術稱為`Web Form`(網址的後綴為`.apsx`);而在`ASP.NET Core`則可以使用`Razor Pages`(具有更簡潔的語法和高效的性能)。 而上述不論使用哪一種技術,它們皆有提供不同風格的開發準則:smiley: ,像是 MVC、RESTful(一種軟體設計模式,定義好開發的風格、標準,讓大家去實現)。 <br> #### C# 能做到的事情其實比你想的還多:moyai: 除了上面提到的項目外,以下列舉了我還能理解的開發項目,至於不能理解的~~改天再說吧~~: * 微服務(gRPC、MediatR、Docker...) 軟體架構風格,將大型應用程式拆分成許多小服務,每個服務獨立運行,且可使用不同語言、資料庫、工具開發和維護 * 遊戲 * 行動應用程式 * 機器學習 * 物聯網(IoT) * ... <br> #### 補充重點 * 很多事情 .NET 的底層都幫我們處理好了,以至於不用再額外造輪子,或者考慮到資安:lock:方面的防範需求,同時,在容易變動的地方給開放出來,讓我們工程師可以客製化處理問題 * 夾在這兩者間,就產生出多種模式供我們選擇,也帶來需多規則需要遵守,這個也只能靠經驗去逐一克服了 <!--* C# 與 JavaScript 相比,雖同為程式語言,但背後能處理的事情,差異是非常大的--> <br> --- <br> ### 資料庫<small>(**D**ata**B**ase,DB)</small> <br> > 一個系統如果需要儲存**長時間**存在的資料,那就把它放進資料庫裡吧! <br> 基本上,資料庫就是用來**存放**任何內容(文字、數字、圖片...),而資料庫的存在就是為了**好管理**,日益擴大且複雜:bomb:的資料,通常會牽扯到對它的存取、修改、保護、組織等。 若以寬鬆點來定義,只要**有邏輯**的將資料存在電腦裡,都可被認為是一個資料庫,例如:EXCEL、筆記本,但這種處理方式不恰當,因為要自行設計出一套架構去存取資料,這花費的時間成本太高:money_mouth_face:,而且此架構還要能應付,當它變大後是否還那麼好用等問題。 <br> #### 資料庫管理系統<small>(**D**ata**B**ase **M**anagement **S**ystem)</small> 還好目前市面上已有極**穩定**且功能**強大**的資料庫系統可供選擇(MS-SQL、MySQL、Oracle...),而通常講的資料庫,本質上是在講資料庫管理系統,為管理資料庫而設計的軟體。 我們所使用的 **DBMS** 為 `Microsoft SQL Server`,為微軟推出的資料庫管理系統,它有幾個主要功能,**管理資料**、**管理權限**、**控制效能**與**備份資料**等,且提供了一個有介面的管理工具 **SSMS**(SQL Server Management Studio,圖形介面整合管理工具),幫助我們管理、開發、查詢資料庫。 <br> #### SQL<small>(**S**tructured **Q**uery **L**anguage,結構化查詢語言)</small> 用來**操作**資料庫的程式語言,透過對資料庫下達查找的**指令**,幫助我們在茫茫資料中找出我們要的資訊,又或者可下達新增、修改、刪除等指令,去針對資料做出對應的**行為**。 <br> :dizzy_face: **CRUD**<small class=text-muted>(**C**reate、**R**ead、**U**pdate、**D**elete,增查改刪)</small> 這四個動作為最常見的行為 ```sql= --新增一筆資料 INSERT INTO Student VALUES(1, '王小明', '國語', 95); --查詢資料表所有內容 SELECT * FROM Student; --針對表內的所有 "王小明" 改為 "王永慶" UPDATE Student SET NAME='王永慶' WHERE NAME='王小明'; --刪除表內 ID 為 1 的資料 DELETE FROM Student WHERE ID=1; ``` <br> <br> **下面為 MS-SQL 的程式碼範例:** 建立一個學生成績的資料表,並在最後把低於60分的學生找出來 <small class="text-muted">*(輸出結果在語法下方)*</small> <iframe height="750" style="width: 100%;" scrolling="no" title="Untitled" src="https://dbfiddle.uk/3k4-ixAM" frameborder="1" loading="lazy" allowtransparency="true" allowfullscreen="true"> </iframe> <br> <br> <br> <br> C# 有提供另一個用來讀資料庫的框架(`ADO.NET`)可以使用 ```csharp= class Program { static void Main(string[] args) { // 資料庫連接字串 string connString = "..."; // 建立資料庫連接 using (SqlConnection conn = new SqlConnection(connString)) { // 開啟連接 conn.Open(); // 建立 SQL 指令 string sql = "SELECT * FROM Student"; // 執行 SQL 指令 using (SqlCommand command = new SqlCommand(sql, conn)) { //... } // 關閉連接 conn.Close(); } } } ``` 可以注意`第15行`,那個地方就是可以下 MS-SQL 語法的區塊,當然不只可以下查詢語法,其它像新增、修改、刪除皆可以在那個地方處理。 <br> #### :nerd_face: MS-SQL 的索引 當今天查資料的過程變慢,下意識就會想到是否有**建立**索引,而索引的建立就是提升查詢速度的關鍵之一,它背後是將資料表設定索引的欄位,預先**系統化整理**過,因為已經重新排序過,所以搜尋範圍縮小,搜尋速度就會提升。 但這個系統化整理,實際上是又建立一個對應表,來提升查詢速度,所以是用**空間換取時間**:timer_clock: ,所以千萬不要一昧地建立索引。 <br> #### 補充重點 * MS-SQL、SQLServer 這兩者都是微軟的資料庫管理系統 Microsoft SQL Server,只是命名不同 * 我們雖然 C# 和 MS-SQL 都是微軟的產品,但並不表示 C# 只能和 MS-SQL 應用,C# 當然也能使用資料庫框架,去讀別的資料庫的資料(MySQL、Oracle…) * 當然在開發過程中,還有其他需要關注的技術,如: * 檢視表 * 預存程式 * 函式 * Trigger * 交易機制 * 備份還原 * ... <br> --- --- --- <br> ## 開發工具  用友善的圖形介面進行程式的撰寫、編譯、除錯,幫助工程師更有效地進行程式開發。 <br> ### Visual Studio vs Visual Studio Code 兩者皆是微軟所提供的開發工具,只是兩者在定位上有點不同。 ==Visual Studio== 是 **IDE**<small class="text-muted">(**I**ntegrated **D**evelopment **E**nvironment,整合開發環境)</small>,提供軟體開發生命週期中**所有階段的處理**,包括設計、開發、測試、佈署等工具,且收集了很多開發 .NET 程式的便捷功能(MVC 框架模板、資料庫視覺化介面...)。 ==Visual Studio Code== 提供的僅只是單純的**程式碼編輯器**,目標就是讓你簡單快速的撰寫程式碼,適合用於前端開發。 <br> | | Visual Studio | Visual Studio Code | |:----------------:| --------------------------------------------------------- | ------------------ | | **跨平台** | 只能用在 Windows、macOS | 跨平台 | | **跨語言** | 跨語言 | 跨語言 | | **收費** | 免費、付費 | 免費 | | **軟體大小** | 約 5 GB ~ 20 GB<br>因為含有大量的 .NET 功能,會佔很大空間 | 約 40 MB ~ 70 MB | | **開發專案大小** | 適合中、大型專案 | 適合小規模的專案 | | **啟動程式速度** | 慢 | 快 | <br> #### Intelligent code completion 智能感知:see_no_evil: 早期寫程式是要開筆記本,然後將程式碼一個個字元打進筆記本中,再依純文字檔的編碼,另外儲存成程式檔案。而這過程中,你必須把語言的語法背起來,再來要每個字元都打出來,整個過程必須正確無誤,再 Run 程式時,才會成功執行。 然而開發工具提供一項功能**程式碼輔助完成工具**:heartpulse: ,解決了需要背語法的問題,只要輸入程式前面的關鍵字,後面就會出現各種與此語言相關的語法組合供選擇。而這兩個開發工具都有此功能,大大的加速程式碼的撰寫,並提高程式的開發速度。 <br> #### 程式碼重構:speak_no_evil: 另一個優秀的功能就是程式碼排版,若要自行注意程式碼的排版,還要刻意的去用空白健、tab 鍵處理,但使用開發工具提供的排版功能(Format),讓你不論多複雜的版面(甚至不同語言),敲打**快捷鍵**後,程式碼一樣會呈現的漂漂亮亮的。 <br> #### DeBug:hear_no_evil: 而我認為使用開發工具,帶來最大的好處,就是有視覺化的除錯功能,讓你可以針對有問題的地方下**斷點**,並進入其中去逐一將問題做排除。 DeBug 也是在模擬程式碼執行的過程,藉由這項功能,可以去了解不同的工程師是怎麼想、怎麼寫 code 的,活用此功能,也是工程師必備的一項能力ㄚ~~ <br> #### 補充重點 * Visual Studio 和 .NET 是有相依性的,所以若要使用新的語法,Visual Studio 就必須跟著做升級,不然它會不懂新語法的規則而報錯 * Visual Studio 與 .NET 綁得較緊,較適合開發與 .NET 相關的程式 * Visual Studio Code 有提供較多前端的套件,在只有開發網頁時,帶來的好處較大 <br> --- --- --- <br> ## 網頁伺服器  是一種軟體,負責接收並回應網路上的請求,例如瀏覽器中的網頁請求。 網頁伺服器其實也是一台電腦,只是這台電腦的等級:100: ,比起一般電腦來的高,且會有一個**網頁伺服器軟體**(IIS、Apache、nginx...)。 而這台電腦有幾個特點: * 永遠要開機運作 * 永遠要連上網路 * 永遠要有固定的 IP <br> #### 簡要的運作機制 1. 在瀏覽器的網址列上輸入==https://www.geosmart.tw/GSMART_MIS/Default.aspx==,按下 Enter 鍵 2. 途中經過網路上的某一台 DNS 伺服器(也是台電腦),透過用 DNS 分析網域,並前往對應到的 IP 地址(也就是 Server) 3. 到達目的地後,網頁伺服器會先檢查請求的 URL 是否有配對到現有文件 *<small class="text-muted">GSMART_MIS:站台名稱、Default.aspx:網頁文件</small>* 4. 有配對到就複製一份,回傳至來源 IP,沒有就回應 404:face_with_head_bandage: 5. 瀏覽器收到回應後,開始渲染網頁 <br> > 瀏覽器向伺服器發送一個某文件的請求(Request),伺服器不論有沒有找到**都會**有回應(Response),找到了檔案就按**需求**(取得資料庫資料、或對資料進行一些加工)去處理,而未找到就會噴錯誤訊息給瀏覽器(404 Not Found)。 <br> <br> ### IIS<small>(**I**nternet **I**nformation **S**ervices,網際網路資訊服務)</small>  是一個支援 HTTP 協議、FTP 協議的網頁伺服器,這也是由微軟開發的軟體,且使用在 Windows 平台上,並提供豐富的圖形化介面可操作,常用於網頁架設、檔案傳輸、電子郵件等。 <br> ### 選擇 IIS 當 Web Server 的因素 基本上,自家的產品不打自家人:baby: ,我們從後端程式語言、資料庫、開發工具、作業系統,都選擇了微軟的產品,一方面是較熟悉 Windows 的操作環境、模式;另一方面則是因為,大家都是同個媽生的,**相容性**通常比其他家公司的產品還要好(*其他家的當然也可以用,只是比較麻煩*)。 從瀏覽器發出請求到回應,在 IIS 上都能有良好的控制權可以介入,而與其它網頁伺服器相比,IIS 在 Windows 平台下是最簡單好用的伺服器。 <br> ### IIS 常用的功能 * 建立應用程式集區(藉由獨立的 Session,去區分站台內的使用者) * 建立多個網站站台 * 建立虛擬目錄 * 繫結憑證 * 支援負載平衡 <br> ### 內建不同的模組,提供不同的功能 * **Requset Filtering 要求過濾** 針對副檔名、HTTP 方法、Header 大小,做阻擋:no_entry: * **Default Document 預設文件** 當只有輸入預設網址,會跑當初設定的檔案名稱 * **Directory Browsing 瀏覽目錄** 當訪問任一個路徑,該路徑下沒有預設頁面,就會顯示為目錄樣式(通常會關掉) * **Error Pages 錯誤網頁** 當遇到 HTTP Error 要顯示的頁面 * **Dynamic IP Restriction IP位址及網域限制** 限制:shield:同一 IP 的同時最大連線數,或是時間內的連線數最多能有幾個 * ... <br> <br> > 簡單來說,通過在 IIS 介面上的操作,可以輕鬆的達到一些效果,例如:AD 驗證、設定 SSL 或 Log 等機制 <br> <br> #### 補充重點 * 通常網頁伺服器分為軟體與硬體,軟體是我們可控制的部分,而以硬體會由第三方廠商負責,所以調校系統效能,在工程師範圍,只能進行 Code Review 去針對耗效能的 Code 做改寫 * 通常一個新開的 VM,都要先安裝 .NET Framework,再去安裝 IIS,之後才有辦法架站 <br> --- --- --- <br> ## 版本管控  透過有效的管控,能記錄專案內各個版本的改動,並為每次改動編上序號。 <br> ### 為什麼版本需要管控 假設 A 有一份**燈會專案**,需要 B 協助撰寫 ```sequence Note left of A: 燈會專案_1.0 A->B: 哈摟,你好\n麻煩請你填寫某區塊的可行性 Note right of B: B 撰寫中 B-->A: 燈會專案_1.1 Note left of A: A 獲得一份,燈會專案_1.1 Note right of A: 過了一陣子後\n專案格式有變,需要 B 再次協助撰寫 Note left of A: 目前專案版本為\n燈會專案_2.0 A->B: 燈會專案_2.0\n Note right of B: B 撰寫中 B-->A: 燈會專案_2.1 Note left of A: A 獲得一份,燈會專案_2.1 Note right of B: B 發現有寫錯,在重丟一份 B-->A: 拍謝\n燈會專案_2.1(改) Note left of A: A 獲得一份,燈會專案_2.1(改) ``` 可以發現,因為當下可能為小幅度的修改,而檔案命名就產生了不同的風格(==燈會專案_2.1== -> ==燈會專案_2.1(改)==)。 <br> 上面例子是個簡單的例子,實務上經過**長時間**不同**人**:raising_hand: 不斷的**修改**,到最後你的資料夾的版本線可能就會呈現一團亂,無法區分版本線,以及此版是誰改的,更別提要比對差異了。 <br> > 現實中可能會出現的狀況...  [圖片來源](https://backlog.com/git-tutorial/tw/intro/intro1_1.html) <br> :heavy_check_mark: 而這種用人工方式來管理文件版本,似乎不是個好辦法,這就是為什麼需要使用**版本管控系統**的其中一種原因。 <br> <br> ### SVN<small>(**S**ub**V**ersio**N**)</small> 是一個開放原始碼的版本管理系統,用於管理開發過程中程式碼的變,它是一個**集中式版本管控系統**,意即所有的版本紀錄都放在某台電腦上,供所有有權限的開發人員做存取。 ```graphviz digraph 集中式版本管控系統 { node [shape=box] "SVN Server"->{"Computer A" "Computer B" "Computer C"} } ``` *<small class="text-muted">此架構下,使用者將會透過 Server 的 URL(需要連線),在檔案總管內取得版本。</small>* <br> 它也有提供一套圖形化介面的軟體(TortoiseSVN),在 Windows 平台上使用,與檔案總管整合,可透過在目錄上按右鍵選單,即可完成「SVN」的操作。  <br> ### SVN 的特色 * 每次的提交(Commit)都會紀錄在版控上,並有自己的**版本碼**(不用手動編號) * 可以知道是**誰**有做過新增、修改、刪除 * 可以做到簡單的**權限管控** * 可以**比較**各版本之間的程式碼、文件有何差異  *<small class="text-muted">紅色字體為 word 新增的文字,下方為 SVN 版本差異的視窗</small>* * 可以**回溯**到之前的任何版本 <br> <!--### 實際執行面的過程 模擬從頭到尾的演練 順帶提到每次都要update取得最新版 <br> --> #### 補充重點 * 因為只有放在一台電腦上,當它出現什麼意外,就會損失慘重,所以要固定做備份 * Server 的空間,決定了 SVN 能存放資料的容量 * 因為是集中式管理,當一個人做完任何操作提交後,與此專案版本有關的人都得進行同步,否則版本將會出錯 <br> --- --- --- <br> ## :crown: 總結 一個動態網頁的專案從開始到完成的生命週期,開發歷程大概會是這樣: 1. 決定做什麼類型的案子,了解一下資料面的內容、專案架構等 *<small class="text-muted">靜態網頁、動態網頁、資料再哪、形象網站還是地圖網站...</small>* 2. 決定是否要用「RWD」 3. 選擇「.NET Framework」或「.NET Core」 *<small class="text-muted">是否要跨平台</small>* 4. 使用「Visual Studio」開發程式 *<small class="text-muted">是否要用 .NET 的框架</small>* 5. 建立該專案的「SVN」版控 *<small class="text-muted">不論自己或多人協作,有個版本依據,當意外發生時,才不會出意外</small>* 6. 產生網頁框架(`ASP.NET`)的模板:dart: *<small class="text-muted">此模板可以在 .NET 的體系下,開發前、後端</small>* 7. 結合前端的技術「HTML」、「CSS」、「JavaScript」、「jQuery」、「Bootstrap」開發網頁 8. 後端則先規劃「MS-SQL」要開的表、欄位、設計關聯等 9. 並用「C#」撰寫核心邏輯 *<small class="text-muted">資料庫串接、資安防範、前端輸入驗證等</small>* 10. 經過反覆測試,直到確認完畢:fire: *<small class="text-muted">功能是否正常、基本資安防範、程式碼的重構、效能的改善</small>* 11. 最後部署到 IIS 上 *<small class="text-muted">確認是否有憑證需要安裝,有沒有負載平衡等</small>* <br> 不同的專案類型(或甲方特別要求),所使用的技術都不太一樣 這就是一個專案的程式開發會 RUN 的過程,不過每位工程師的先後順序可能不太一樣,但這每一項基本上都會經歷過。 <br> 而前面只要決定好使用的技術後,後面就是考驗工程師的能力,是否能根據需求、規格開發出好維護、好擴充的程式碼,甚至會運用一些[**設計模式**](https://ithelp.ithome.com.tw/articles/10201706):mage: 去撰寫程式碼,期望能達到當需求與先前不同時,可以簡單快速的修改完成。 <br> > 從 A 規則替換為 B 規則時,因為程式設計得當,所以比別人更快完成:zap: <br> <br> <br> **<div class="text-center">介 紹 完 畢 ~ ~</div>** <br><br><br> :link: 參考 --- **前端資源** [HTML](https://zh.wikipedia.org/zh-tw/HTML) [HTML5](https://zh.wikipedia.org/zh-tw/HTML5) [CSS](https://zh.wikipedia.org/zh-tw/%E5%B1%82%E5%8F%A0%E6%A0%B7%E5%BC%8F%E8%A1%A8) **C#資源** [維基百科C#](https://zh.wikipedia.org/zh-tw/C%E2%99%AF#%E8%AA%9E%E8%A8%80%E7%89%B9%E6%80%A7) [C# 介紹](https://ithelp.ithome.com.tw/articles/10213175) [淺談 C# 與 .NET](https://ithelp.ithome.com.tw/articles/10199526) [.NET Framework 底層怎麼執行](https://ithelp.ithome.com.tw/articles/10287290) [.NET Core vs .NET Framework](https://ithelp.ithome.com.tw/articles/10291631) [.NET 5.0 亮點整理](https://blog.darkthread.net/blog/net5-highlight/) [.NET 基本介紹~推](https://huier23.medium.com/net-%E6%96%B0%E6%89%8B%E6%9D%91-%E6%89%93%E4%BB%80%E9%BA%BC%E6%89%93-%E8%A6%81%E6%89%93%E5%8E%BB%E7%B7%B4%E8%88%9E%E5%AE%A4%E6%89%93-6da64ae1d61a) **資料庫資源** [什麼是資料庫](https://tw.alphacamp.co/blog/database-intro) [維基百科資料庫](https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93#%E6%95%B0%E6%8D%AE%E5%BA%93%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F) **開發工具** [維基百科Visual Studio](https://zh.wikipedia.org/zh-tw/Microsoft_Visual_Studio) [維基百科Visual Studio Code](https://zh.wikipedia.org/zh-tw/Visual_Studio_Code) [兩者區別](https://worktile.com/kb/ask/9303.html) [純文字檔](http://kaiching.org/pydoing/cs-guide/unit-01-understanding-the-c-sharp-programming-language.html) **網頁伺服器** [mdn 網頁伺服器](https://developer.mozilla.org/zh-TW/docs/Learn/Common_questions/What_is_a_web_server) [IIS](https://ithelp.ithome.com.tw/articles/10291454) **版本管控** [連猴子都能懂的Git入門指南](https://backlog.com/git-tutorial/tw/intro/intro1_1.html) [版本控管vcs-基礎概念,svn、git比較](https://stevenjhu.com/2019/11/11/%E7%89%88%E6%9C%AC%E6%8E%A7%E7%AE%A1vcs-%E5%9F%BA%E7%A4%8E%E6%A6%82%E5%BF%B5%EF%BC%8Csvn%E3%80%81git%E6%AF%94%E8%BC%83/) [IT 關於SVN(Subversion) 版本控制系統](https://ithelp.ithome.com.tw/articles/10285213) [Subversion 版本控制系統的基礎觀念](https://www.huanlintalk.com/2009/04/introduction-to-version-control-system.html) <br><br><br><br><br><br> <style> code.red { color: #e91e63 !important; font-size: 1.6rem !important; } code.blackred{ color:#900000 !important; font-size: 1.6rem !important; } code.blue { color: #337AB7 !important; font-size: 1.6rem !important; } code.orange { color: #F7A004 !important; font-size: 1.6rem !important; } .markdown-body p > code { color: #c7254e !important; background-color: #f9f2f4 !important; border-radius: 4px !important; padding: 2px 4px !important; font-size: 90% !important; } .markdown-body pre { background-color: #112648; } .markdown-body pre, .markdown-body pre .code .hljs-tag { color: #eee; } img:not(.emoji) { padding: 5px; background: #ffffff; border: 1px solid #eeeeee; -moz-box-shadow: 1px 1px 5px rgba(0, 0, 0, .1); -webkit-box-shadow: 1px 1px 5px rgb(0 0 0 / 10%); box-shadow: 1px 1px 5px rgb(0 0 0 / 10%); margin: 5px 0; } .markdown-body .alert hr { height: 1px; margin: 8px 0 15px 0; background-color: #31708f; } .markdown-body .alert h3, .markdown-body .alert h4 { margin: 0px; } .markdown-body blockquote > p { /* background-color: #f5f5f5;*/ } .markdown-body strong { font-size: 2rem; } /*程式碼等於符號的顏色*/ .token.operator { background: #102546; } </style>
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.