當前位置: 妍妍網 > 碼農

外包公司的人寫的程式碼,被扒出,罵慘了~

2024-06-26碼農

大家好,我是東哥。

今天,我在貼文裏看到一張圖片,裏面展示了一段外包公司員工寫的程式碼,見下圖。

說實話評論區大家討論挺熱烈的,主要是圍繞這段程式碼的品質如何?就我個人而言, 如果站在職業修養的角度來說,那麽,貼出這段程式碼的程式設計師可能存在泄漏原始碼的風險。

我雖然寫了很多年程式碼,這段程式碼確實存在一些問題,有很多最佳化的點,說實話,自從AI出來以後,我感覺AI在寫程式碼方面真的挺強的,特別是現在的AI搜尋更是將以前的搜尋體驗拉升了一個高度,我個人覺得AI將是我們這個時代最大的機會!

既然如此,我將這段程式碼餵給了AI,讓他給出公正的評價,更能讓大家信服。

這裏,我只是給了一個簡單的提示詞,並沒有寫針對性的結構化提示詞,如果對提示詞感興趣的話,可以存取我整理的提示詞倉庫。

網站地址:https://www.songshuhezi.com/tools/short.html

具體提示詞如下:

你現在是一名具有10年經驗的Java程式設計師,我將發給你一段Java後端程式碼,站在你的角度來客觀評價這段程式碼,並給出你的最佳化建議。

好了,我們來看看AI給出的回答,如下圖:

並且它還給了我最佳化後的程式碼:

public classPostRequestService {privatestatic final String FAIL_ID_NUM_KEY = "failIdNum";privatestatic final String MESSAGE_KEY = "message";public com.alibaba.fastjson2.JSONObject sendPostRequest(String url, RequestParams params) {params.put("appId", params.getAppId());params.put("clientId", params.getClientId());params.put("clientSecret", params.getClientSecret()); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<com.alibaba.fastjson2.JSONObject> requestEntity = new HttpEntity<>(params.toJson(), headers); com.alibaba.fastjson2.JSONObject response = null;try { response = restTemplate.postForObject(url, requestEntity, com.alibaba.fastjson2.JSONObject. class); String idNum = response != null ? response.getString("idNum") : null;if ("0000".equals(response.getString("code"))) { log.info("請求成功");return response; } else { handleFailure(idNum, response.getString(MESSAGE_KEY)); } } catch (Exception e) { handleException(e); }return response; }privatevoidhandleFailure(String idNum, String message) { List<String> failIdNums = getFailIdNums();if (idNum != null) { failIdNums.add(idNum); } redisCache.deleteObject(FAIL_ID_NUM_KEY); redisCache.setCacheList(FAIL_ID_NUM_KEY, failIdNums); log.warn("請求失敗: " + message); }privatevoidhandleException(Exception e) { String message = e.getMessage();if (message != null && !message.isEmpty()) { message = message.split("\n")[0]; } List<String> failIdNums = getFailIdNums(); failIdNums.add(message); redisCache.deleteObject(FAIL_ID_NUM_KEY); redisCache.setCacheList(FAIL_ID_NUM_KEY, failIdNums); log.error("請求異常: " + message, e); }private List<String> getFailIdNums() {return redisCache.hasKey(FAIL_ID_NUM_KEY) ? redisCache.getCacheList(FAIL_ID_NUM_KEY) : new ArrayList<>(); }} classRequestParams {private String appId;private String clientId;private String clientSecret;private Map<String, Object> data;// Getter and setter methodspublic com.alibaba.fastjson2.JSONObject toJson() { com.alibaba.fastjson2.JSONObject json = new com.alibaba.fastjson2.JSONObject(); json.put("appId", this.appId); json.put("clientId", this.clientId); json.put("clientSecret", this.clientSecret); json.put("data", this.data);return json; }}

對於這段程式碼到這裏就完了嗎?如果是有經驗的程式設計師,肯定會知道fastjson之前出現過漏洞,我相信AI肯定也知道,但是你不問它,它是不會告訴你的,因為它不是神,它只是機器人😂

我們先來測試一下,我用搜尋引擎去搜一下fastjson之前出現過的漏洞有哪些,然後再來問它,進行對比一下。

搜尋語法: fastjson site:cve.org

接下來,我將問題拋給AI,看看它給出的答案如何?

與搜尋引擎的結果對吧,你會發現有缺失,它有漏掉,並且給出的英文回復,其實出現這個問題是給出的提示詞不夠精準,我接下來與它對話的時候,將指出它的錯誤,並讓它修復答案,這次的表現就很完美了,見下圖

由於我這裏沒有對應的pom檔,並不清楚這個程式碼是否存在漏洞,但我們只能給出一個粗略的提問,我以為它只能給我一個大而範的解決方案,沒想到它的回答驚艷我了,如下圖

兄弟們,你們以為到這裏就結束了嗎?沒有,它竟然給出了我最佳化後的程式碼,而且還做了針對性的防護,源碼如下:

import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import com.alibaba.fastjson.parser.ParserConfig;import com.alibaba.fastjson.serializer.SerializerFeature;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.MediaType;import org.springframework.web.client.RestTemplate;public class PostRequestService {privatestatic final String FAIL_ID_NUM_KEY = "failIdNum";privatestatic final String MESSAGE_KEY = "message";static {// 啟用SafeMode ParserConfig.getGlobalInstance().setSafeMode(true);// 關閉AutoType ParserConfig.getGlobalInstance().setAutoTypeSupport(false); }public JSONObject sendPostRequest(String url, RequestParams params) { params.put("appId", params.getAppId()); params.put("clientId", params.getClientId()); params.put("clientSecret", params.getClientSecret()); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<JSONObject> requestEntity = new HttpEntity<>(params.toJson(), headers); JSONObject response = null;try { response = restTemplate.postForObject(url, requestEntity, JSONObject. class);String idNum = response != null ? response.getString("idNum") : null;if ("0000".equals(response.getString("code"))) { log.info("請求成功");return response; } else { handleFailure(idNum, response.getString(MESSAGE_KEY)); } } catch (Exception e) { handleException(e); }return response; }privatevoid handleFailure(String idNum, String message) { List<String> failIdNums = getFailIdNums();if (idNum != null) { failIdNums.add(idNum); } redisCache.deleteObject(FAIL_ID_NUM_KEY); redisCache.setCacheList(FAIL_ID_NUM_KEY, failIdNums); log.warn("請求失敗: " + message); }privatevoid handleException(Exception e) {String message = e.getMessage();if (message != null && !message.isEmpty()) { message = message.split("\n")[0]; } List<String> failIdNums = getFailIdNums(); failIdNums.add(message); redisCache.deleteObject(FAIL_ID_NUM_KEY); redisCache.setCacheList(FAIL_ID_NUM_KEY, failIdNums); log.error("請求異常: " + message, e); }private List<String> getFailIdNums() {return redisCache.hasKey(FAIL_ID_NUM_KEY) ? redisCache.getCacheList(FAIL_ID_NUM_KEY) : new ArrayList<>(); }} class RequestParams {privateString appId;privateString clientId;privateString clientSecret;private Map<String, Object> data;// Getter and setter methodspublic JSONObject toJson() { JSONObject json = new JSONObject(); json.put("appId", this.appId); json.put("clientId", this.clientId); json.put("clientSecret", this.clientSecret); json.put("data", this.data);return json; }}

我只能說,AI真牛叉,說它垃圾的兄弟們,要反思一下,是不是你的提問方式不對,還是你的知識深度不夠!

但是,之前某位大佬說的「未來將不再存在程式設計師這一職業」,我是不贊同的,並不是我是一名程式設計師,我認同的觀點是:「編程的難度會越來越低,只是低端程式設計師會逐漸被淘汰」。

說實話,你想嗎?如果你只是會CRUD,加上現在這種紅海市場,程式設計師飽和度這麽高,再加上大齡,你哪裏有什麽出路嗎?因此,我建議大部份程式設計師先在某一個領域做深,再拓展自己的廣度,而不是真正的只安心做一個碼農!

各位同學,言盡於此,要想擺脫程式設計師35歲的魔咒,唯有花時間花金錢提升自己的實力!

最後,想學編程的同學,可以關註一下這個網站,上面的內容很全哦😂

網站地址: https://www.j301.cn


熱門推薦