大家好,我是東哥。
今天,我在貼文裏看到一張圖片,裏面展示了一段外包公司員工寫的程式碼,見下圖。
說實話評論區大家討論挺熱烈的,主要是圍繞這段程式碼的品質如何?就我個人而言, 如果站在職業修養的角度來說,那麽,貼出這段程式碼的程式設計師可能存在泄漏原始碼的風險。
我雖然寫了很多年程式碼,這段程式碼確實存在一些問題,有很多最佳化的點,說實話,自從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 methods
public 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 methods
public 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
熱門推薦