# AI幫你寫程式 -- Amazon CodeWhisperer 小開箱
- 在人工智慧猖獗的年代(X,有人說未來的某一天工程師們會大失業,因為AI有辦法自己撰寫程式。這樣的說法也許離現實情形還有一點距離,然而AI程式撰寫助理確實已經融入了許多程式開發者的工作場景裏頭。
- 今天我們要介紹的就是AWS所提供的CodeWhisperer,主要進行一些基本介紹以及實際操作給大家看看囉~
## 為啥要用AWS的CodeWhisperer
- 咳咳~不是我要幫它說話,相信如果有常常在接受這部分訊息的朋朋們第一個想到的或許是GitHub Copilot。
- 雖說AWS官方強調CodeWhisperer並不是Copilot的模仿品。但你鐵定會問說到底為啥要選CodeWhisperer?
- ==這麼說好了~啊他就不用錢齁==:thumbsup: :thumbsup: :thumbsup:
:::info
:information_source: 好我覺得我還是解釋清楚好了XD
- 目前個人版方案可以免費使用,但如果是專業方案當然就要付費囉!
- 官方其實有強調,其建議生成的程式碼大多都是原生的。即使與原始訓練資料庫裏頭的接近,也會給使用者提示。(嘿詳情請見Copilot版權問題)
- 搭配AWS的CodeGuru相關經驗,額外有提供程式碼安全掃描的功能。這點由於以前大學時期學過一點點資安相關的內容,在經過測試後是覺得蠻有趣以及實用的。(但這個免費版是每個月可以用50次喔!!!)
:::
## 功能懶人包
- 嘿~詳見[官網說明](https://aws.amazon.com/tw/codewhisperer/features/)
- 啊我知道大家都很懶,這裡簡單說明一下,其實最大的特點在於在我們平常編寫程式的時候,==CodeWhisperer可以根據你目前所打的註解或是你正在撰寫的片段程式給你一些建議==。
- 我認為重點有兩件事,==一件是根據你打的註解它會幫你寫程式,一件是根據你片段完成的程式,它會依照前文會幫你接續下去==。**(一種很像LLM在玩文字接龍的fu齁XD,我自己使用起來也大概是這種感覺)**
- 除了協助撰寫程式外,官方有特別提到也會根據使用者的程式撰寫風格以及命名方式來給你建議,走一個微客製化的style~
- 當然還有支援多種編譯工具與程式語言,這裡就不一一說明啦!
## 安裝囉
- 以下我以自己較為習慣使用的VS Code作為例子。
- **整體來說其實可以無腦安裝,所以不用太費心神XD。**
1. 打開VS Code,選擇Extension(延伸套件),搜尋AWS關鍵字後,就會看到AWS Toolkit,給它安裝下去。


2. 安裝完成後可以發現在原本延伸套件的那一排多了AWS的圖案,同樣給它大力地點下去,找到CodeWhisperer點選登入的選項。

3. 大力點下去後,你會看到AmazonQ+CodeWhisperer,這時我們選擇免費個人的版本,然後他會跳出要求跳到AWS網站的請求,當然也是大力地給它點下去。



4. 當進入官網後,點選確認並繼續就可以開始註冊會員囉~啊註冊方式很簡單輸入你的mail就可以了!這裡就不放畫面囉~

5. 當註冊完成後就會看到以下畫面,給它選擇同意,就會看到第二張圖片,此時我們就可以放心的關掉網頁來開始使用了。


## 開箱囉
- 正常情況下,我們可以發現原本VS code中點擊註冊的位置,現在會出現以下圖示(寫著**Pause Auto-Suggestions**),==這代表程式撰寫建議的功能正在運行中==,可以透過這個鈕來中止或開啟服務。

### Hello world
- 先簡單舉個例子,嘿~就是這麼沒梗,我希望它幫我寫hello wrold,可以發現當我寫下註解後,系統會跳出print("Hello World")的建議,這時**點擊你的Tab鍵**,就可以選擇成功了。

:::warning
:warning: 還是要解釋一下
- 根據AWS官方功能說明,裏頭有寫到該服務用以了解英文撰寫的註解,但在我實際測試的情況下,發現中文其實也可以啊!
:::
- 在正常跳出建議的情況下,可以看到如畫面中的上一步/下一步/接受,==這個是因為可能有很多個建議可供選擇==,這時我們可以透過**左右與Tab鍵來操作**。

### 剪刀石頭布
- 那接下來我們來一個小遊戲,我請他幫我寫一個剪刀石頭布的小遊戲。
- **嘿~我真的只寫了第一行的註解,然後就一直無腦按Tab跟Enter,然後還真的可以跑,而且程式看過之後似乎也沒什麼太大的毛病。**
```python=1
# write a Rock Paper Scissors game
import random
def play():
user = input("What's your choice? 'r' for rock, 'p' for paper, 's' for scissors\n")
computer = random.choice(['r', 'p', 's'])
# need to showow the computer's choice
print(f"Computer chose {computer}")
if user == computer:
return 'It\'s a tie'
# r > s, s > p, p > r
if is_win(user, computer):
return 'You won!'
return 'You lost!'
def is_win(player, opponent):
# return true if player wins
# r > s, s > p, p > r
if (player == 'r' and opponent == 's') or (player == 's' and opponent == 'p') \
or (player == 'p' and opponent == 'r'):
return True
print(play())
```
- 換用中文註解試試看。
```python=1
# 撰寫一個剪刀石頭布的程式
import random
# 剪刀石頭布的選項
options = ["剪刀", "石頭", "布"]
# 隨機產生一個選項
computer_choice = random.choice(options)
# 輸入使用者的選項
user_choice = input("請輸入剪刀石頭布:")
# 判斷勝負
if computer_choice == user_choice:
print("平手")
print("結果:")
elif computer_choice == "剪刀" and user_choice == "石頭":
print("你贏了")
print("結果:")
elif computer_choice == "剪刀" and user_choice == "布":
print("你輸了")
print("結果:")
elif computer_choice == "石頭" and user_choice == "剪刀":
print("你輸了")
print("結果:")
elif computer_choice == "石頭" and user_choice == "布":
print("你贏了")
print("結果:")
elif computer_choice == "布" and user_choice == "剪刀":
print("你贏了")
print("結果:")
elif computer_choice == "布" and user_choice == "石頭":
print("你輸了")
print("結果:")
else:
print("輸入錯誤")
print("結果:")
# 印出選項
print("你選擇的是:", user_choice)
print("電腦選擇的是:", computer_choice)
```
:::warning
:warning: 又要解釋一下(先說這裡是個人感受啊)
- 根據AWS官方功能說明,裏頭有寫到該服務用以了解英文撰寫的註解,這裡我算是感受到了XD。
- 英文註解的情況下,**沒有任何問題即可成功執行**。
- 中文註解的情況下,**會發現CodeWhisperer給我的建議最後會跳針,而且中間有一兩行多餘需要刪除的部分**。
- 即使不考慮上述情況,中文註解的情況下讓我多按了好幾次Tab與Enter。**即我用英文註解下,CodeWhisperer可以一次產生較多行的程式給我。**
:::
### 剛剛皆為使用註解來期待CodeWhisperer給我們程式撰寫建議,接下來要試試看給它片段程式,是否會接的合理。
- 嘿我又懶得想例子了,所以直接交給LeetCode吧!
- 我給了他一題merge sort的開頭(**給他到第10行**),然後他就幫我寫完了。
```python=1
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: None Do not return anything, modify nums1 in-place instead.
"""
while m > 0 and n > 0:
if nums1[m - 1] > nums2[n - 1]:
nums1[m + n - 1] = nums1[m - 1]
m -= 1
else:
nums1[m + n - 1] = nums2[n - 1]
n -= 1
while n > 0:
nums1[n - 1] = nums2[n - 1]
n -= 1
return nums1
```
## 加碼送Security Scan開箱
- 記得前面有提到AWS有CodeGuru相關經驗,因次除了程式撰寫建議外,==他還附上了程式安全掃描功能==。
- 這裡附上不負責任聲明,小弟大概有一萬年沒碰資安內容了,有錯的話還請指教。
- 嘿~我隨意寫了一段有SQL injection疑慮的程式,來看看會不會掃描得出來呢?
- 附帶說明當需要掃描的時候,只要找到剛剛開啟或暫停程式撰寫建議那邊就找的到囉~

- 可以發現Amazing~他還真的發現了

## 開箱小心得
- 不用錢我就給滿分(X
- 咳咳~好,認真講一下好了。
- 其實以本身在學校擔任了多年的程式設計助教來說,我覺得這是個不錯的學習方式,當然不是說像我前面這樣直接一行註解給他,然後作業就完成了XD。而是可以發現就如同我前面說提到的,==該服務給我一種程式接龍的感覺,對於程式初學者來說,如果能專心於當下把程式邏輯順清楚,遇到語法不會的時候,此時我們就可以透過下註解,或是打個幾個程式碼,就可以找出我們需要的語法內容,我覺得會大大提升程式的學習效率==。
- 另外一方面,他還有個功能是,==當程式撰寫建議被我們採納後,有時他會跳出相關程式碼的舉例與內容供我們參考==,這也是一個不錯的學習管道。(相信大家都知道找對好範例有多麼的重要QQ)
- 但必須實話實說,以目前情況來看,該服務是一個協助的工具,並非自動程式撰寫機器人,遇到真的複雜的問題時,還是需要人類工程師來解決。==但我認為對於工程師來說,最麻煩的事情大概就是那些瑣碎的語法更新又或是一些撰寫上面的疏忽與小細節,因此該服務對於實務上其實有蠻大的貢獻,甚至在我找尋相關文章時,也有發現不少工程師分享以該服務做為實務開發的小工具了。==
- 所以重點就是
:::info
:information_source: 小心得
- **以現有的功能來說,免費真的很佛心了。**
- **對於程式初學者來說,會是一個學習上面用來節省時間與學習成本的好工具。**
- **對於系統開發者來說,協助工程師們在實務上壁面一些疏忽,或是加速開發進度。**
- **程式掃描工具更是一個蠻特殊且重要的內容(如果可以不限次數會更好XD)。**
:::
- ==另外其實有發現AWS還把另一個強大的功能也併入了,那就是Amazon Q==,這個有空再來介紹,這次的分享就到這裡囉~以上。