ฉันจะเข้าใกล้การผสานที่ซับซ้อนได้อย่างไร


25

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

ฉันจะทำการผสานนี้อย่างปลอดภัยได้อย่างไรในขณะที่รักษาการเปลี่ยนแปลงที่สำคัญทั้งสองด้านของสาขา


ขอบคุณทุกคนสำหรับคำติชมที่ยอดเยี่ยม ฉันจะไปหา git-imerge และถ้านั่นกลายเป็นว่ายุ่งฉันจะใช้วิธีการสาขาใหม่!
Vlad Spreys

มีใครอธิบายได้git cherry-pickไหมว่าทำไมเราถึงใช้ไม่ได้ที่นี่
Santosh Kumar

1. คำอธิษฐาน 2. rebase 3. ทดสอบ 4. ผสาน
AK_

1
ฉันชอบการรีบูตในสถานการณ์นี้เพราะมันจะถูกส่งโดยคอมมิชชัน นอกจากนี้ยังจะช่วยให้คุณสควอชฟีเจอร์ใหม่ก่อนที่คุณจะสามารถใช้งานโค้ดที่ผสานได้ YMMV
สตีเฟ่น

คำตอบ:


27

หัวใจของการรวมสองส่วน (อาจเข้ากันไม่ได้) ของรหัสเป็นปัญหาการพัฒนาไม่ใช่ปัญหาการควบคุมเวอร์ชัน คำสั่งการผสาน Git อาจช่วยได้ในกระบวนการนี้ แต่ขึ้นอยู่กับรูปร่างของปัญหา

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

ลองนึกภาพสถานการณ์สมมติในอุดมคติ: คุณจะค้นพบว่าสาขาหลักและสาขาคุณลักษณะแต่ละส่วนมีการแก้ไขเฉพาะส่วนของโค้ดดังนั้นคุณจึงสามารถยอมรับการเปลี่ยนแปลงทั้งหมดและทำได้ดี

แน่นอนว่าเกือบจะไม่แน่นอน แต่คำถามคือ: มันจะถูกลบออกจากสถานการณ์ในอุดมคตินี้ไกลแค่ไหน? คือการเปลี่ยนแปลงที่ผสมผสานกันอย่างไร?

นอกจากนี้ฟีเจอร์ย่อยเก่า ๆ นั้นเติบโตได้อย่างไร? มันอยู่ในสถานะการทำงานที่ดีหรือไม่ (หรือไม่ทราบ)? คุณสมบัตินี้เสร็จสิ้นไปมากแค่ไหน?

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

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


+1 "ฉันอาจพิจารณาสร้างทางแยกใหม่ล่าสุดและรวมคุณสมบัติเก่าเข้าด้วยตนเองอีกครั้ง"
mika

1
คำถามสำคัญแรกคือ: สาขาคุณลักษณะเก่าสร้างหรือไม่ มันทำงานหรือไม่ ถ้าไม่ใช่มันจะยากมากที่จะทดสอบการผสานของคุณ
Móż

22

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

การผสานสองสาขาโดยไม่ทราบประวัติเบื้องหลังรหัส (เนื่องจากคุณเพิ่งเข้าร่วมโครงการ) เป็นเรื่องยากมากและฉันคิดว่าแม้แต่นักพัฒนาที่ติดตามโครงการตั้งแต่ต้นอาจมีข้อผิดพลาดในการผสาน

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

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

ฉันคิดว่าอย่างน้อยที่สุดการพยายามผสานก็เป็นสิ่งที่ดีที่สุดที่ควรทำ หากสิ่งนั้นล้มเหลวหรือกลายเป็นเรื่องยากเกินไปให้ลองเก็บเชอร์รี่ถ้าผิดไปด้วยตนเอง


2
Defintiely ไม่ใช่วิธีที่ถูกต้อง
Andy

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

10
@DavidPacker: ฉันไม่คิดว่า GavianoGrifoni แนะนำให้ทิ้งงานทั้งหมดลงน้ำ เขาแนะนำให้โอนการเปลี่ยนแปลงจากสาขาเก่าด้วยตนเองไปยังสายการพัฒนาปัจจุบันในลักษณะทีละขั้นตอน ที่จะทิ้งประวัติศาสตร์เก่าออกไปไม่มาก
Doc Brown

3
@DavidPacker วันที่ 1: สาขาล้าสมัยไปแล้วปีที่สอง: คนที่แต่งตัวประหลาดกับการตกแต่งมันไม่ทราบรหัสเลย ด้วยปัจจัยทั้งสองนี้การใช้ซ้ำด้วยตนเองเป็นวิธีเดียวที่สมจริงในการเข้าถึงภารกิจ ไม่มีใครแนะนำการคัดลอกวางแบบง่าย ๆ ของการแก้ไขเคล็ดลับของสาขาเก่า
gbjbaanb

5
@DavidPacker: การรวมความขัดแย้งอาจกลายเป็นความชั่วร้ายได้ - หากคุณต้องแก้ไข 500 ข้อในครั้งเดียวก่อนที่คุณจะได้รับโปรแกรมในสถานะที่คอมไพล์และทดสอบได้อีกครั้ง นั่นเป็นสถานการณ์แบบที่ OP คาดหวังไว้ที่นี่ หากคุณคิดว่าเป็นไปได้ที่จะใช้คอมไพล์อย่างมีประสิทธิภาพเพื่อหลีกเลี่ยงสถานการณ์ "ทั้งหมดหรือไม่มีอะไร" ทำไมคุณไม่แก้ไขคำตอบของคุณและบอก OP ว่าวิธีนี้สามารถทำได้อย่างไร
Doc Brown

16

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


6

การพยายามรวมหัวฉีดเข้ากับสาขาที่ค้างเป็นปีอาจเป็นการออกกำลังกายด้วยความหงุดหงิดและเพิ่มความลึกของบุ๋มบนโต๊ะด้วยหน้าผากของคุณ

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

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

คุณอาจต้องการแยกสาขาจากหัวหน้าสาขาเก่าสำหรับบทบาทของการรวมในการเปลี่ยนแปลงอื่น ๆ นี่คือเพิ่มเติมเกี่ยวกับการตรวจสอบให้แน่ใจว่าการกระทำและประวัติศาสตร์เมื่อมีคนมองกลับไปที่มันชัดเจนและสื่อสารสิ่งที่บทบาทและนโยบายของแต่ละสาขาคือ สาขาเก่าเป็นสาขาคุณลักษณะ สาขาที่คุณกำลังทำงานคือสาขาการสะสมและการกระทบยอด

สิ่งนี้จะง่ายกว่านี้หากยังมีฟีเจอร์เก่า ๆ หรือสาขาที่วางจำหน่ายอยู่และสามารถเข้าถึงได้ง่าย (บางแห่งมีนโยบายในการล้างชื่อสาขาที่เก่ากว่าบางวันเพื่อให้รายการสาขาไม่ท่วมท้น )

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

นอกจากนี้ยังใช้งานได้กับระบบควบคุมเวอร์ชันอื่นด้วย บางครั้งฉันจำเป็นต้องรวมกลุ่ม svn ที่เฉพาะเจาะจงลงในสาขา (การเก็บเชอร์รี่) สำหรับสถานที่หนึ่งแก้ไขสาขาเพื่อทำงานกับสถานที่นั้นแล้วรวมกลุ่ม svn กลุ่มถัดไปแทนที่จะทำเพียง svn ขายส่ง ผสาน

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

นอกจากนี้ก็หมายความว่าคุณจะไม่ได้เล่นซ้ำต้นแบบอย่างมีประสิทธิภาพบนกิ่งไม้เก่า - คุณกำลังจะเลือกคุณสมบัติที่อาจจะไม่สมบูรณ์ - และคุณสมบัติเหล่านั้นอาจจะเล่นไม่เป็นระเบียบ

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


+1 นี่คือโซลูชันทางเลือกที่มีศักยภาพที่น่าสนใจซึ่งใช้การผสานเพื่อรวมการเปลี่ยนแปลงขนาดใหญ่ อย่างไรก็ตามฉันเห็นข้อเสีย: สมมติว่าคุณมีเวอร์ชันหลัก ABCDE และคุณต้องการรวมฟีเจอร์สาขา A1 เข้ากับ E อาจมีความพยายามอย่างมากในการรวมรหัสเข้ากับ BC และ D ตัวอย่างเช่นถ้า D ถึง E คืออะไร การเปลี่ยนแปลงการออกแบบขนาดใหญ่ที่ทำให้การเปลี่ยนแปลงที่เพิ่มขึ้นใน B, C และ D ไม่เกี่ยวข้องหรือไม่ นอกจากนี้ยังขึ้นอยู่กับความสามารถของสถานที่ในครั้งแรกอีกด้วย แนวทางที่เป็นไปได้ที่มีประโยชน์ แต่ต้องพิจารณาความเหมาะสมก่อนเริ่มต้น

1

ขั้นตอนที่ 1 เรียนรู้เกี่ยวกับรหัสวิเคราะห์สถาปัตยกรรมและการเปลี่ยนแปลงที่เกิดขึ้นกับทั้งสองสาขาตั้งแต่บรรพบุรุษร่วมกันล่าสุด

ขั้นตอนที่ 2 หากคุณลักษณะปรากฏขึ้นอย่างกว้างขวางและสัมผัสกับส่วนต่าง ๆ ของรหัสผสานแก้ไขข้อขัดแย้งทดสอบแก้ไข ฯลฯ เป็นเส้นทางที่มีความสุขคุณค่อนข้างดีที่จะไป มิฉะนั้นไปที่ขั้นตอนที่ 3

ขั้นตอนที่ 3 วิเคราะห์พื้นที่ของความขัดแย้งเข้าใจผลกระทบการทำงานและเหตุผลในรายละเอียด อาจมีความขัดแย้งในข้อกำหนดทางธุรกิจที่เข้าใจง่าย พูดคุยกับ BAs, devs อื่น ๆ ตามความเหมาะสม สัมผัสถึงความซับซ้อนที่เกี่ยวข้องกับการแก้ไขสัญญาณรบกวน

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


0

1. เปลี่ยนเป็นสาขาที่ใช้เป็นผู้พัฒนา / สาขาหลัก

นี่คือสาขาที่มีการเปลี่ยนแปลงล่าสุดของระบบ สามารถmaster, core, devมันขึ้นอยู่กับ บริษัท ในกรณีของคุณอาจเป็นmasterโดยตรง

git checkout master
git pull

ดึงเพื่อให้แน่ใจว่าคุณมีสาขาการพัฒนาหลักรุ่นล่าสุดแล้ว

2. ชำระเงินและดึงสาขาที่มีงานที่คุณคาดว่าจะเสร็จ

คุณดึงเพื่อให้แน่ใจว่าคุณมีเนื้อหาล่าสุดของสาขา โดยการตรวจสอบโดยตรงโดยไม่ต้องสร้างในเครื่องก่อนคุณต้องแน่ใจว่าไม่ได้มีเนื้อหาใหม่จากmaster(หรือสาขา dev หลักตามลำดับ) ในนั้น

git checkout <name of the obsolete branch>
git pull origin <name of the obsolete branch>

3. รวมสาขาการพัฒนาหลักเข้ากับสาขาที่ล้าสมัย

ก่อนที่จะรันคำสั่งต่อไปนี้ตรวจสอบให้แน่ใจว่าโดยพิมพ์git branchหรือgit statusว่าคุณอยู่ในสาขาที่ล้าสมัย

git merge master

git mergeคำสั่งจะพยายามที่จะรวมเนื้อหาจากสาขาที่ระบุในกรณีนี้masterเพื่อให้สาขาที่คุณมีในขณะนี้ที่

เน้นจะพยายามที่จะ อาจมีข้อขัดแย้งที่ผสานซึ่งจะต้องแก้ไขโดยคุณและคุณเท่านั้น

4. แก้ไขความขัดแย้งผสานกระทำและผลักดันการแก้ไขข้อขัดแย้ง

originหลังจากแก้ไขความขัดแย้งในการผสานไฟล์ทั้งหมดที่มีขั้นตอนการกระทำและผลักดันการแก้ไขความขัดแย้งที่จะ

git add .
git commit -m "fixed the merge conflict from the past year to update the branch"
git push

โดยทั่วไปคุณสามารถเรียกgit add .ไปยังไฟล์ทั้งหมดสำหรับการสเตจ เมื่อจัดการกับข้อขัดแย้งในการผสานคุณต้องการให้ไฟล์ที่จำเป็นทั้งหมดได้รับการปรับปรุง

หมายเหตุเพิ่มเติม

การแก้ไขข้อขัดแย้งผสานอาจเป็นงานที่น่าเบื่อ โดยเฉพาะถ้าคุณยังใหม่กับ บริษัท คุณอาจไม่มีความรู้ที่ถูกต้องในการแก้ไขข้อขัดแย้งผสานทั้งหมดเพียงอย่างเดียว

ใช้เวลาในการตรวจสอบความขัดแย้งทั้งหมดที่เกิดขึ้นและแก้ไขอย่างเหมาะสมก่อนที่จะทำงานต่อ


มันสามารถเกิดขึ้นได้คุณเริ่มทำงานในสาขาอายุหนึ่งปีรวมสถานะการพัฒนาในปัจจุบันเข้าด้วยกันและจะไม่มีข้อขัดแย้งในการผสานเลย

สิ่งนี้เกิดขึ้นแม้ว่าระบบจะมีการเปลี่ยนแปลงจำนวนมากในปีนี้ แต่ก็ไม่มีใครแตะต้องไฟล์ที่ถูกเปลี่ยนแปลงจริงในสาขาอายุหนึ่งปี


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

เดวิดตราบใดที่วิธีการมาตรฐานนี้ใช้ได้ดีและ OP ควรลองก่อน แต่มีความเสี่ยงที่จะได้รับความขัดแย้งที่มากเกินไปในสถานการณ์ที่อธิบายไว้เพื่อจัดการกับพวกเขาในลักษณะ "ทั้งหมดหรือไม่มีอะไร"
Doc Brown

@ dan1111 ว่ามีความขัดแย้งที่ผสานได้อย่างสมบูรณ์และในความเป็นจริงผ่านพวกเขาเป็นวิธีที่จะไป เนื่องจากสาขาไม่ได้ถูกแตะต้องเป็นเวลาหนึ่งปีคุณสามารถมั่นใจได้เลยว่ามันไม่มีอะไรสำคัญและจะไม่ส่งผลกระทบต่อระบบมากนัก ดังนั้นแม้ว่าสาขาจะอยู่หลังหนึ่งปี แต่คุณสามารถรับความขัดแย้งได้เพียง 2 ถึงไม่มีเลย
Andy

4
การสันนิษฐานว่าสาขานี้ไม่มีความสำคัญ มันอาจเป็นการเปลี่ยนแปลงการออกแบบขั้นพื้นฐานที่ถูกทอดทิ้งและตอนนี้ถูกหยิบขึ้นมาอีกครั้ง มันอาจเป็นอะไรก็ได้ คุณมีสิทธิที่ว่ามันอาจจะเป็นเรื่องง่ายและมีสามารถจะมีน้อยหรือไม่มีความขัดแย้ง - ซึ่งในกรณีนี้คำตอบของคุณจะถูกต้อง แต่นั่นไม่ใช่ความเป็นไปได้เท่านั้น

@ dan1111 หากมีคนไม่ได้สัมผัสสถานที่ในสาขาที่แยกต่างหากเป็นเวลาหนึ่งปีมันจะไม่สะท้อนการเปลี่ยนแปลงของระบบมากนัก นี่มาจากประสบการณ์ของตัวเองกับสาขาที่ล้าสมัย (6 เดือนขึ้นไป)
Andy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.