ฉันเป็นแฟนตัวยงของ Linux และซอฟต์แวร์โอเพ่นซอร์ส ปัจจุบัน ฉันใช้ Arch Linux (ใช่ ฉันใช้ arch btw) โดยมี i3 เป็นตัวจัดการหน้าต่าง ฉันคิดว่าประวัติที่แบ่งปันของฉันกับกลุ่มเป็นเรื่องปกติ มันไปจาก “หือ? อะไรวะ?” จาก "อ่าโอเค" เป็น "นั่นสมเหตุสมผลแล้ว" ข้อสรุปของฉันคือฉันควรใช้มันบ่อยขึ้น นั่นคือสถานะปัจจุบัน วันหนึ่ง (เมื่อวาน) ฉันพบปลั๊กอิน fzf-vim ที่ไหนสักแห่งบนอินเทอร์เน็ต ช่วยให้สามารถดำเนินการค้นหาแบบคลุมเครือผ่าน fzf (เครื่องมือค้นหาแบบคลุมเครือสำหรับเทอร์มินัล) และเปิดผลการค้นหาเป็นบัฟเฟอร์ใหม่ในกลุ่ม ดังนั้นฉันจึงพูดกับตัวเองว่า: “ทำไมต้องใช้อิเล็กตรอนบวมอย่าง vscode หรือ IDE อย่าง Eclipse ถ้าคุณแค่แก้ไขไฟล์อยู่เสมอ”

เป้าหมาย

เป้าหมายของการทดลองของฉันคือการสร้างบริการร้านค้าแค็ตตาล็อกง่ายๆ ที่โหลดราคาของผลิตภัณฑ์ต่างๆ จากฐานข้อมูลผ่านตำแหน่งข้อมูล REST สำหรับฐานข้อมูล ฉันต้องการใช้ฐานข้อมูล PostgreSQL ที่ทำงานภายในคอนเทนเนอร์ Docker สำหรับไมโครเซอร์วิสนั้นเอง ฉันใช้ Quarkus เพราะมันมอบประสบการณ์ที่ยอดเยี่ยมสำหรับนักพัฒนา และคุณสามารถรันได้อย่างง่ายดายในเทอร์มินัล Quarkus เป็น Java Framework ที่ใช้มาตรฐานที่แตกต่างจาก Jakarta EE และ Eclipse Microprofile ความท้าทายควรเป็น: “อย่าแตะต้องไฟล์ใด ๆ ด้วยสิ่งใดนอกจากเป็นกลุ่ม!”

การตั้งค่า

ดังที่ได้กล่าวไปแล้ว สำหรับโปรเจ็กต์นี้ ฉันใช้ Docker และ Java แน่นอนว่าฉันต้องติดตั้ง Docker และสิ่งที่เกี่ยวข้องกับ Java (JDK, Maven, …) สำหรับ vim ฉันติดตั้ง vim-plug เพื่อจัดการปลั๊กอินอื่น ๆ จากนั้นจึงติดตั้ง fzf สำหรับ vim นอกจากนี้ ฉันกำหนดค่าให้เปิดเมนู ': ไฟล์' บน Ctrl + P (เช่นใน vscode):

โทร plug#begin('~/.vim/plugged')
เสียบ 'junegunn/fzf.vim'
โทร plug#end()

nnoremap ‹เงียบ› ‹C-p› :Files‹CR›

สำหรับโปรเจ็กต์นั้นเอง ฉันใช้หน้า Quarkus Quickstart ซึ่งเริ่มต้นโครงสร้างพื้นฐานของโปรเจ็กต์ให้กับคุณ และจัดเตรียมโฟลเดอร์ zip ให้กับโปรเจ็กต์ บางทีนั่นอาจเป็นการโกง แต่ฉันไม่สนใจ

เริ่มต้น

ตัวช่วยสร้างโปรเจ็กต์ Quarkus ได้สร้างคลาสไว้แล้วบางคลาส แต่แน่นอนว่า ฉันไม่ต้องการเรียกคลาสเอนทิตีของฉันว่า “MyEntity” หรือคลาสอินเทอร์เฟซ REST “GreetingResource” ดังนั้นจึงถึงเวลาที่ต้องกำจัดพวกมันออกไป สิ่งนี้กลายเป็นเรื่องเจ็บปวดไปแล้วหลังจากการนำทางผ่านไดเร็กทอรีต่าง ๆ ไม่ใช่เรื่องง่าย:

ดังนั้นฉันจึงคิดว่าน่าจะมีวิธีนำทางไปยังโฟลเดอร์ต่างๆ เช่น ไฟล์ได้ ไม่มีเลย (หรืออย่างน้อยฉันก็หามันไม่เจอ) ดังนั้นการปรับโครงสร้างโปรเจ็กต์ตัวอย่างจึงค่อนข้างน่ารำคาญอยู่แล้ว และโครงสร้างแพ็กเกจของโปรเจ็กต์ Java ก็มีส่วนช่วยด้วย โชคดีที่ Quarkus สร้างไฟล์คลาสเพียงสองไฟล์ในไดเร็กทอรีเดียว ดังนั้นฉันจึงลบมันและสร้างไดเร็กทอรีสามไดเร็กทอรีสำหรับปลายทาง คลาสคอนโทรลเลอร์ และโมเดลข้อมูล ในที่สุดความสุขในการพัฒนาก็สามารถเริ่มต้นได้จริงๆ!

ดาต้าโมเดล

ฉันสร้างคลาสเอนทิตีแรกซึ่งควรเป็นตัวแทนหมวดหมู่ในระบบร้านค้า:

เมื่อมาถึงจุดนี้ ฉันพบว่าฉันไม่รู้ว่าจะนำเข้าคลาสที่ใช้แล้วได้ที่ไหน อืม ใช่. ใครสามารถคาดการณ์สิ่งนั้นได้บ้าง? ฉัน googled “vim java” และพบหน้าเกี่ยวกับการใช้ vim เป็น Java IDE ที่สมบูรณ์ (https://spacevim.org/use-vim-as-a-java-ide/) แต่พูดตามตรง มันดูเหมือนจะเหนือกว่ามาก แม้ว่าภาพหน้าจอจะดูเจ๋งก็ตาม เป้าหมายไม่ได้อยู่ที่การค้นหาว่า Spacevim สามารถแทนที่ Java IDE ดั้งเดิมอย่าง Eclipse ได้หรือไม่ แต่เพื่อค้นหาว่า vim ที่มีปลั๊กอินเปิดไฟล์เพียงพอสำหรับการพัฒนาไมโครเซอร์วิสหรือไม่ เป็นเรื่องที่น่าสงสัยว่า Java เป็นการตัดสินใจที่ดีจริงๆ หรือไม่ ในขณะเดียวกันฉันก็สงสัย (แพ็กเกจร่วมเพศ!) แต่เอาล่ะ ฉันสามารถ Google เพียงไม่กี่คลาสที่ฉันต้องนำเข้าได้

ดังนั้นฉันจึงสร้างคลาสเอนทิตีทั้งหมด ดังนั้นคุณสมบัติการแยกหน้าต่างและการคัดลอกและวางจึงเป็นพร ฉันแน่ใจว่ามันจะเริ่มสนุกทันทีที่มีการสร้างคลาสทั้งหมด และฉันสามารถใช้คุณสมบัติเปิดด่วนที่เป็นส่วนหนึ่งของปลั๊กอิน fzf ได้

เมื่อมาถึงจุดนี้ ฉันตระหนักว่าฉันต้องรวมลอมบอกเป็นการพึ่งพา maven ดังนั้นฉันจึงค้นหามันใน Maven Central Repository และเพิ่มเข้าไป นี่คงไม่มีอะไรง่ายไปกว่านี้ใน Eclipse ฉันไม่ไว้ใจ Eclipse Maven Editor

จุดสิ้นสุด

ใช่ หลังจากสร้างเอนทิตีสำหรับฐานข้อมูลแล้ว ฉันจะดำเนินการต่อที่จุดสิ้นสุด สำหรับบางคน ขั้นตอนถัดไปเชิงตรรกะคือการเขียนคลาสคอนโทรลเลอร์ที่ดึงข้อมูลเอนทิตีจากฐานข้อมูล หรือแม้แต่เริ่มต้นด้วยจุดสิ้นสุดเพื่อกำหนดอินเทอร์เฟซ แต่ไม่มี. ขั้นแรก สินค้าในคลังสินค้า หน้าร้าน และสุดท้ายคือรถโฟล์คลิฟท์ เมื่อฉันกำลังคิดถึงเรื่องนี้ การเปรียบเทียบนี้ดูไม่สมเหตุสมผลนัก แต่ให้มองตามความเป็นจริง: ในที่สุดคุณก็ใส่ใจกับปัญหาด้านลอจิสติกส์

ดังนั้นฉันจึงสร้างไฟล์คลาสใหม่และนี่คือช่วงเวลาที่ฉันเข้าใจว่าฉันไม่ควรทิ้งคลาสตัวอย่างไป เพราะฉันต้อง google ตัวอย่าง Quarkus ในตอนแรกเพื่อที่จะรู้ว่าฉันต้องการแพ็คเกจใด

ในขณะที่เขียนจุดสิ้นสุด ฉันตระหนักว่าการใช้เวลาคิดถึงจุดสิ้นสุดมากขึ้นอาจเป็นความคิดที่ดี จำเป็นต้องมีการปรับโครงสร้างใหม่บางอย่าง แต่ฉันตัดสินใจทำอย่างนั้นหลังจากเขียนคลาสคอนโทรลเลอร์แล้ว ใช่ ฉันควรเริ่มต้นด้วยสถาปัตยกรรมจุดสิ้นสุด REST ล่วงหน้าหรือคลาสที่โหลดข้อมูลจากฐานข้อมูล

ตัวควบคุมฐานข้อมูล

ส่วนนี้ก็น่าตื่นเต้นน้อยกว่าน่ารำคาญเช่นกัน ฉันรู้ว่าฉันรู้จัก Java Persistence API น้อยกว่าที่ฉันคิดไว้มาก โดยพื้นฐานแล้วมันเป็นการใช้ Google และการคัดลอกและวางเป็นจำนวนมาก และฉันก็เกือบจะยอมแพ้เมื่อรู้ว่าโดยพื้นฐานแล้วฉันทำเสร็จแล้ว

การวิ่งครั้งแรก

ฉันเขียนโค้ดที่จำเป็นทั้งหมดที่ฉันนึกได้ ตอนนี้ก็ถึงเวลาดูว่างานทั้งหมดจะประสบความสำเร็จหรือไม่ ถึงเวลาแล้วที่จะต้องค้นหาว่าฉันเป็นนักพัฒนาแบบไหน ถึงเวลาที่จะค้นหาว่าฉันรู้ว่าฉันกำลังทำอะไรอยู่หรือว่าฉันแค่พิมพ์ไร้สาระ

ฉันป้อนคำวิเศษลงในเทอร์มินัลของฉันซึ่งจะเริ่มกระบวนการรวบรวมและเปิดใช้เฟรมเวิร์ก ในช่วงเวลานี้คอมไพเลอร์จะตรวจสอบทุกบรรทัดที่ฉันเขียนอย่างไร้ความปราณี นี่คือเวลา เวลา... ฉันทำด้ายหาย นี่คือผลลัพธ์

./mvnw ควาร์คัส:dev

น่าประหลาดใจที่มีข้อผิดพลาดเพียงไม่กี่อย่างเท่านั้น… ข้อผิดพลาดทางไวยากรณ์พื้นฐานมาก แต่มีเพียงไม่กี่ข้อผิดพลาดเท่านั้น อืม ฉันคาดหวังมากกว่านี้จริงๆ แต่เอาล่ะ นี่เป็นเพียงข้อผิดพลาดในการคอมไพล์เท่านั้น อาจมีข้อผิดพลาดรันไทม์มากมาย

คือ… การแก้ไขมันทำให้มองเห็นข้อผิดพลาดได้มากขึ้น:

หลังจากแก้ไขข้อผิดพลาดในการคอมไพล์แล้ว ในที่สุดเซิร์ฟเวอร์ก็เปิดใช้งานได้ ฉันตื่นเต้นมากและต้องการทดสอบจุดสิ้นสุด หลังจากข้อผิดพลาดในการรวบรวมเล็กน้อย การทำงานหนักของฉันก็คุ้มค่า ตอนนี้ ผมจะดูว่าการดำเนินการทั้งหมดนี้ อย่างน้อยก็เป็นการลองที่ดีหรือไม่ แต่แล้วมันก็โยน IllegalArgumentExceptions และล้มเหลว

ดูเหมือนว่าพารามิเตอร์เส้นทางจะต้องเป็นสตริงและไม่ใช่แม้แต่ UUID คำถามเกิดขึ้นในหัวของฉันถ้ามันสมเหตุสมผลกว่าที่จะแปลงพวกมันที่จุดปลายทุกจุดหรือสร้าง ParamConverter... ฉันไม่ต้องการสร้าง ParamConverter เพราะตอนนั้นฉันจะต้องใช้ Google Javadocs มากมายอีกครั้งถึงแม้ว่ามันจะเป็นเช่นนั้นก็ตาม แนวทางที่สะอาดกว่า/ทั่วไปมากขึ้น แต่การค้นหาไวยากรณ์ทั้งหมดนี้และนำเข้าสิ่งต่าง ๆ อีกครั้งนั้นทำงานได้มากโดยไม่มีข้อผิดพลาดในการเขียนอัตโนมัติ ฉันได้รับอีก: letion ดังนั้นฉันไม่ได้ทำ หลังจากแก้ไขข้อผิดพลาดทีละรายการในแต่ละคลาส บันทึกต่อไปนี้จะปรากฏขึ้น:

ด้วยเหตุผลบางประการ ไม่สามารถเตรียมใช้งาน Transactional Bean ได้ โดยไม่ได้อ่านข้อความแสดงข้อผิดพลาดทั้งหมด ฉันคิดว่าเป็นเพราะคุณสมบัติการคงอยู่ที่ขาดหายไปและฐานข้อมูลที่ขาดหายไป ดังนั้นฉันจึงสร้างไฟล์นักเทียบท่าด้วยฐานข้อมูล postgres และเพิ่มคุณสมบัติแอปพลิเคชันที่จำเป็น:

ใช่แล้ว… นั่นไม่ได้ผล

หลังจากนั้นไม่นาน ฉันพบว่าปัญหาคือคำอธิบายประกอบ @ApplicationScoped ที่ขาดหายไปในคลาสบริการ มันค่อนข้างง่ายที่จะเพิ่มพวกมัน คุณลักษณะแมโคร vim ช่วยให้สามารถบันทึกการพิมพ์คำสั่งนำเข้าได้อย่างง่ายดายตามด้วยการใส่คำอธิบายประกอบชั้นเรียน การกดเพียงสองปุ่มเพื่อดำเนินการตามขั้นตอนเดียวกันในไฟล์อื่นก็เป็นเรื่องดี ในขั้นตอนถัดไป ฉันต้องแก้ไขข้อความค้นหา JPQL:

แล้วมันก็ใช้งานได้...

ในที่สุดฉันก็สามารถทดสอบมันได้ ฉันเพิ่มข้อมูลบางส่วนผ่านไคลเอนต์ postgres sql และเรียกจุดสิ้นสุด และผลลัพธ์ก็คือ:

ใช่ ไม่ใช่สิ่งที่ฉันต้องการเลย ฉันต้องเพิ่มการพึ่งพา Resteasy Jsonb Quarkus ผลลัพธ์คืออย่างน้อยรายการ json:

ฉันอ่านข้อมูลในฐานข้อมูล เปลี่ยนการตั้งค่าเพื่ออัปเดตแทนการดรอปและสร้าง และรีสตาร์ทเซิร์ฟเวอร์ ผลลัพธ์เดียวกันอีกครั้ง:

และหลังจากลองอีกครั้ง ฉันก็พบว่าฉันลืมเพิ่มส่วนขยาย jsonb (ไม่ ไม่รู้ว่าสิ่งนี้เกิดขึ้นได้อย่างไร) จากนั้นมันก็ได้ผล:

ในที่สุด! หลังจากหลายปีที่ผ่านมา จุดสิ้นสุดทั้งหมดกำลังทำงาน ความรู้สึกที่ดีที่สุดในโลก!

บทสรุป

ฉันจะทำมันอีกครั้งหรือไม่? ไม่ มันเป็นความคิดที่ดีเหรอ? ไม่ มันสนุกไหม? ไม่ มันเป็นกิจกรรมที่ดีสำหรับบ่ายวันเสาร์ที่ฝนตกหรือเปล่า? อาจเป็นแบบนั้น แต่ก็มีอันที่ดีกว่าแน่นอน ฉันได้เรียนรู้อะไรบางอย่างหรือเปล่า? ใช่. vim ไม่ใช่ IDE และ IDE ช่วยให้การพัฒนาซอฟต์แวร์ง่ายขึ้น ผลลัพธ์ที่ได้ช่างน่าประหลาดใจ!

วิธีการใช้ just vim อาจทำงานได้ดีกว่าสำหรับภาษาที่เป็น — และฉันกำลังพยายามบอกว่ามันเป็นการทูตมากที่สุดเท่าที่จะเป็นไปได้ — เข้มงวดน้อยกว่าในด้านไวยากรณ์และโครงสร้างโฟลเดอร์ (ใช่ ฉันกำลังพูดถึง Javascript และ Python) อย่างไรก็ตาม ฉันได้เรียนรู้ที่จะชื่นชมคุณสมบัติเจ๋งๆ ของกลุ่ม โดยเฉพาะการบันทึกมาโครเป็นสิ่งที่ฉันคิดถึงใน Eclipse อย่างแน่นอน ในอนาคต ฉันจะลองใช้ส่วนขยาย IDE เช่น vrapper เพื่อรวมประสบการณ์ดีๆ ที่ฉันทำกับ vim ใน Eclipse