วิศวกรรมซอฟต์แวร์

ถาม - ตอบสำหรับมืออาชีพนักวิชาการและนักเรียนที่ทำงานในวงจรการพัฒนาระบบ

8
ฉันจะรับมือกับผู้จัดการที่มักรบกวนสิ่งที่ฉันทำ แต่ไม่เข้าใจจริง ๆ ได้อย่างไร
เราทุกคนมีพวกเขาผู้จัดการที่มาจากยอดขายหรือดูรหัส 10 หรือมากกว่าปีที่แล้ว แต่คิดว่าพวกเขารู้วิธีเขียนรหัส ฉันจะทำอะไรได้บ้างเพื่อให้เกิดความประทับใจว่าฉันรู้สึกซาบซึ้งกับการแทรกแซงของเขา แต่ก็ควรทำให้มันสั้นที่สุด หรือฉันควรมีส่วนร่วมมากขึ้นกับผู้จัดการเพื่อให้ความรู้แก่เขา / เธอด้วยเทคนิคการเขียนโค้ดและการปฏิบัติที่ทันสมัย? ท้ายที่สุดผู้จัดการที่เข้าใจสิ่งเหล่านี้จะสามารถพูดคุยกับลูกค้าและผู้บริหารระดับสูงเมื่อพูดคุยเกี่ยวกับโครงการและระยะเวลาของโครงการ

17
“ วิทยาการคอมพิวเตอร์! = วิศวกรรมซอฟต์แวร์” เป็นข้อแก้ตัวในการสอนการเขียนโปรแกรมไม่ดีหรือไม่?
ล็อคแล้ว คำถามและคำตอบนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ เราทุกคนได้ยินมัน เมื่อใดก็ตามที่มีการอภิปรายเกี่ยวกับ CS จบที่มีทักษะการพัฒนาที่ไม่ดีใครบางคนก็บอกว่าในที่สุด วิทยาศาสตร์คอมพิวเตอร์ไม่ใช่วิศวกรรมซอฟต์แวร์ ปัญหาที่ผมเห็นก็คือการเขียนโปรแกรมและการพัฒนาซอฟต์แวร์ที่มีการเรียนการสอนในหลักสูตร CS พวกเขามักจะสอนไม่ดี ถ้ามันถูกสอนแล้วทำไมไม่สอนมันให้ถูกต้องตั้งแต่ครั้งแรกล่ะ? * * * * ดังนั้นฉันต้องการจะดูว่าความคิดเห็นของคำถาม 2 ข้อคืออะไร: CS! = SE โต้แย้งว่าเป็น copout หรือข้อแก้ตัวสำหรับการสอนทักษะการเขียนโปรแกรมที่ไม่เหมาะสม โดยไม่คำนึงถึงคำตอบของคุณสำหรับคำถาม 1; ถ้าคุณอยู่ในตำแหน่งที่มีอำนาจยิ่งใหญ่ในการตัดสินใจ: คุณจะเน้นการสอนที่เหมาะสมของการเขียนโปรแกรมในหลักสูตร CS หรือไม่? * * * * ฉันมีข้อสงสัยตามหลักฐานประวัติที่ฉันได้รับตลอดการศึกษาของฉันว่านักวิชาการส่วนใหญ่ไม่จำเป็นต้องเขียนรหัสเพื่อรักษาและไม่ได้รักษารหัสและทำให้ไม่มีความรู้ / ทักษะ เพื่อสอนอย่างมีประสิทธิภาพ

16
ถ้าฉันไม่รู้จัก C แต่ฉันดีกับ C ++? [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการถกเถียงอภิปรายโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 8 ปีที่ผ่านมา ฉันมีคำถามที่ฉันคิดว่าสามารถตอบได้ดีที่สุดที่นี่ ฉันเป็นคนที่ค่อนข้างดีC++และฉันก็คุ้นเคยกับภาษาฉันได้อ่านAccelerated C++และทำแบบฝึกหัดเกือบทั้งหมดแล้ว อย่างไรก็ตามฉันมีปัญหาใหญ่ ฉันจำเป็นต้องเรียนรู้Cหรือไม่? ฉันไม่เคยทำCมาก่อนเลยในชีวิต ฉันเพิ่งเริ่มต้นC++เมื่อฉันเริ่มเขียนโปรแกรม อาจเป็นเพราะฉันสนใจรู้อยู่เสมอว่าทำไมทุกคนเรียกภาษานี้ว่าซับซ้อน ตอนนี้แม้ว่าฉันรู้คำตอบสำหรับคำถามนั้น) ฉันมีความสนใจเป็นพิเศษในการรู้ว่าฉันสามารถอยู่รอดได้โดยไม่ต้องรู้ว่าCในโลกปัจจุบัน เช่นถ้าฉันให้สัมภาษณ์ใน บริษัท ถ้าฉันบอกพวกเขาว่าฉันไม่รู้C- พวกเขาจะใช้มันเป็นปกติหรือไม่? สองภาษาที่ฉันเก่งคือ Python และ C ++ ฉันถามสาเหตุนี้ฉันได้ยินมาว่า บริษัท ถามโครงสร้างข้อมูลในการสัมภาษณ์ ดังนั้นหากพวกเขาขอให้ฉันใช้มันและถ้าฉันทำใน C ++ มันเป็นที่ยอมรับหรือไม่? และคนที่พูดว่า 'คุณจะไม่รู้ C ได้อย่างไรเมื่อคุณ C …
23 c++  c 

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

14
ผู้จัดการเลือกภาษาการเขียนโปรแกรมอย่างไร
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 8 ปีที่ผ่านมา ไม่ใช่ความลับสำหรับทุกคนที่ผู้จัดการสามารถและมักจะกำหนดภาษาการเขียนโปรแกรมที่จะใช้สำหรับโครงการ ในฐานะโปรแกรมเมอร์เองฉันไม่เคยเข้าใจสิ่งนี้เลย แต่ตอนนี้ฉันคิดว่าฉันทำ: ฉันเพิ่งได้รับการเปิดเผยเมื่อ Joel Spolsky พูดในพอดคาสต์ว่าพวกเขาควรใช้ QuickBooks เพราะ "นักบัญชีทุกคนในโลกรู้" สิ่งนี้ทำให้ฉันรู้สึกคล้ายกับ "เลือก Java เพราะโปรแกรมเมอร์ทุกคนในโลกรู้" ตอนนี้ฉันได้เห็นปัญหาเดียวกันจากมุมมองอื่นฉันไม่ทราบมากเกี่ยวกับการบัญชี แต่ฉันรู้อะไรบางอย่างเกี่ยวกับการเขียนโปรแกรมฉันสงสัยว่าโปรแกรมเมอร์สามารถช่วยให้แน่ใจได้อย่างไรว่าภาษาโปรแกรมที่ถูกเลือกถูกเลือกสำหรับโครงการ ?

17
COBOL ยังคงคุ้มค่ากับการเรียนรู้หรือไม่? [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการถกเถียงอภิปรายโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ล็อคแล้ว คำถามและคำตอบนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ การเรียนรู้ภาษาโคบอลยังคงสมเหตุสมผลหรือไม่?
23 learning  cobol 

6
ขั้นตอนทั่วไปที่ใช้เมื่อคอมไพเลอร์คืออะไรพิมพ์แบบตรวจสอบ "ซับซ้อน" นิพจน์?
หมายเหตุ:เมื่อฉันใช้ "ซับซ้อน" ในชื่อเรื่องฉันหมายถึงนิพจน์มีตัวดำเนินการและตัวถูกดำเนินการจำนวนมาก ไม่ใช่ว่าการแสดงออกของตัวเองนั้นซับซ้อน ฉันเพิ่งทำงานกับคอมไพเลอร์เรียบง่ายเพื่อประกอบ x86-64 ฉันได้เสร็จสิ้นการรวบรวมส่วนหน้าหลักของคอมไพเลอร์ - lexer และ parser - และตอนนี้ฉันสามารถสร้างการแสดงบทคัดย่อต้นไม้ไวยากรณ์ของโปรแกรมของฉัน และเนื่องจากภาษาของฉันจะถูกพิมพ์แบบสแตติกฉันกำลังทำขั้นตอนต่อไป: พิมพ์การตรวจสอบซอร์สโค้ด อย่างไรก็ตามฉันมีปัญหาและไม่สามารถแก้ไขด้วยตนเองได้อย่างสมเหตุสมผล ลองพิจารณาตัวอย่างต่อไปนี้: โปรแกรมแยกวิเคราะห์ของคอมไพเลอร์ของฉันได้อ่านบรรทัดของรหัสนี้: int a = 1 + 2 - 3 * 4 - 5 และแปลงเป็น AST ต่อไปนี้: = / \ a(int) \ - / \ - 5 / \ + * / \ / …

7
อัลกอริทึมใดที่คุณจะใช้เพื่อความคล้ายคลึงกันของสตริงมากที่สุด
ฉันกำลังออกแบบปลั๊กอินเพื่อระบุเนื้อหาในหน้าเว็บต่างๆโดยอิงตามที่อยู่ ดังนั้นฉันอาจมีที่อยู่เดียวซึ่งดูเหมือน: 1 someawesome street, anytown, F100 211 หลังจากนี้ฉันอาจพบที่อยู่นี้ในรูปแบบที่แตกต่างกันเล็กน้อย 1 someawesome street, F100 211, หรืออาจคลุมเครือ someawesome street F100 เทคนิคเหล่านี้เป็นที่อยู่เดียวกัน แต่มีระดับความคล้ายคลึงกัน ฉันต้องการ a) สร้างตัวระบุที่ไม่ซ้ำกันสำหรับแต่ละที่อยู่เพื่อทำการค้นหาและ b) ค้นหาว่าที่อยู่ที่คล้ายกันปรากฏขึ้นเมื่อใด ฉันควรดูอัลกอริทึม / เทคนิค / สตริงใด ระยะทางของ Levenshtein ดูเหมือนเป็นตัวเลือกที่ชัดเจน แต่สงสัยว่ามีวิธีการอื่นใดที่จะให้ยืมตัวเองที่นี่

1
ทำไมเอกสารในบางภาษาจึงพูดว่า "เทียบเท่า" แทนที่จะเป็น "?"
เหตุใดเอกสารในบางภาษาจึงพูดว่า "เทียบเท่า" แทนที่จะเป็น "?" ตัวอย่างเช่นPython Docsพูด itertools.chain(*iterables) ... เทียบเท่ากับ: def chain(*iterables): # chain('ABC', 'DEF') --> A B C D E F for it in iterables: for element in it: yield element หรือการอ้างอิง C ++บนfind_if: พฤติกรรมของแม่แบบฟังก์ชั่นนี้เทียบเท่ากับ: template<class InputIterator, class UnaryPredicate> InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred) { while (first!=last) …

3
ฉันควรหลีกเลี่ยงการใช้ int ที่ไม่ได้ลงชื่อใน C # หรือไม่
ฉันเพิ่งคิดเกี่ยวกับการใช้จำนวนเต็มไม่ได้ลงนามใน C # (และฉันคิดว่าอาร์กิวเมนต์ที่คล้ายกันสามารถพูดเกี่ยวกับ "ภาษาระดับสูงอื่น ๆ ") เมื่อต้องการจำนวนเต็มปกติแล้วฉันไม่ต้องเผชิญกับภาวะที่กลืนไม่เข้าคายไม่ออกของขนาดของจำนวนเต็มตัวอย่างจะเป็นคุณสมบัติอายุของคลาสบุคคล (แต่คำถามไม่ได้ จำกัด เฉพาะคุณสมบัติ) โดยที่ในใจมีเท่าที่ฉันเห็นเพียงหนึ่งข้อได้เปรียบของการใช้จำนวนเต็มไม่ได้ลงนาม ("uint") มากกว่าจำนวนเต็มลงนาม ("int") - สามารถอ่านได้ หากฉันต้องการแสดงความคิดเห็นว่าอายุเป็นบวกได้ฉันสามารถบรรลุสิ่งนี้ได้โดยการตั้งค่าประเภทอายุเป็น uint ในทางกลับกันการคำนวณจำนวนเต็มที่ไม่ได้ลงชื่อสามารถนำไปสู่ข้อผิดพลาดทุกประเภทและทำให้การดำเนินการเช่นการลบสองอายุทำได้ยาก (ฉันอ่านนี่เป็นหนึ่งในเหตุผลที่ Java ละเว้นจำนวนเต็มที่ไม่ได้ลงชื่อ) ในกรณีของ C # ฉันยังสามารถคิดได้ว่าประโยคของผู้พิทักษ์จะเป็นทางออกที่ให้สิ่งที่ดีที่สุดในโลกทั้งสอง แต่สิ่งนี้จะไม่สามารถใช้ได้เมื่อฉันยกตัวอย่างเช่นอายุจะผ่านไปยังวิธีการบางอย่าง วิธีแก้ปัญหาคือการกำหนดคลาสที่เรียกว่า Age และให้อายุคุณสมบัติเป็นสิ่งเดียวที่มี แต่รูปแบบนี้จะให้ฉันสร้างคลาสจำนวนมากและจะเป็นแหล่งที่มาของความสับสน (นักพัฒนาอื่น ๆ จะไม่ทราบเมื่อวัตถุเป็นเพียงเสื้อคลุม และเมื่อมันมีอะไรบางอย่างที่ทำให้สับสนมากขึ้น) แนวปฏิบัติทั่วไปที่ดีที่สุดเกี่ยวกับปัญหานี้มีอะไรบ้าง ฉันจะจัดการกับสถานการณ์ประเภทนี้ได้อย่างไร

5
เหตุใดเครื่องมือสร้างจึงใช้ภาษาสคริปต์แตกต่างจากภาษาโปรแกรมพื้นฐาน
ฉันเพิ่งได้ใช้เครื่องมือสร้างบางอย่างสำหรับโครงการ Nodejs ในที่ทำงานเมื่อฉันตระหนักว่าเครื่องมือสร้าง / ระบบหลักของภาษาส่วนใหญ่ใช้ภาษาที่แตกต่างจากภาษาโปรแกรมพื้นฐาน ตัวอย่างเช่นmakeไม่ใช้ C หรือ C ++ เพื่อเขียนสคริปต์และant (หรือ Maven) ไม่ได้ใช้ Java เป็นภาษาสำหรับการเขียนสคริปต์ ภาษาที่ใหม่กว่าอย่าง Ruby ใช้ภาษาเดียวกันเพื่อสร้างเครื่องมือเช่นrakeซึ่งเหมาะสมกับฉัน แต่ทำไมไม่เป็นเช่นนี้เสมอไป? ข้อดีของการมีเครื่องมือสร้างที่ใช้ภาษาต่างจากภาษาต้นแบบคืออะไร

2
เมื่อใดควรใช้ def ใน Groovy
ฉันได้รับการพัฒนาใน Groovy สักครู่แล้วและฉันสงสัยว่าฉันควรจะใช้การคัดเลือกนักแสดงแบบไดนามิกบ่อยแค่ไหนdef? เพื่อนร่วมงานของฉันเชื่อว่าเราควรใช้มันเสมอเพราะช่วย Groovy ในวิธีที่ฉันไม่เข้าใจ ขณะนี้เมื่อประกาศเมธอดส่งคืนชนิดและอาร์กิวเมนต์ฉันชอบที่จะจงใจระบุว่าควรนำวัตถุใดบ้างและคายออกมา (สำหรับการอ่านรหัสและฉันมาจากพื้นหลัง Java มันสมเหตุสมผลกับฉัน): String doSomething(String something){ //code } // vs def doSomething(def somthing){ //code } // vs def doSomething(somthing){ // code } ดังนั้นฉันเดาคำถามของฉันมันเป็นเพียงการตั้งค่าเมื่อต้องการใช้defหรือมีข้อได้เปรียบที่แท้จริงในการใช้มันตลอดเวลา? (ฉันเพิ่มตัวอย่างสุดท้ายเพราะฉันรู้สึกว่ามันเหมาะกับคำถามเป็นตัวเลือกที่ทำงานได้สำหรับ Groovy)

1
เป็นวิธีปฏิบัติที่ดีในการเรียกใช้ฟังก์ชันคอนโทรลเลอร์จากคอนโทรลเลอร์อื่นหรือไม่?
ฉันมีกรณีที่ฉันจัดการกับตรรกะของการค้นหาในคอนโทรลเลอร์เดียวและฉันสร้างข้อมูลบางส่วนจากการค้นหาและกลับมาเป็นสถิติ เป็นวิธีปฏิบัติที่ดีในการเรียกใช้ฟังก์ชันคอนโทรลเลอร์จากคอนโทรลเลอร์อื่นหรือไม่? หรือผู้ควบคุมสองคนไม่ควร 'คุย'
23 mvc 

5
จะทำอย่างไรกับประวัติ svn ขนาดใหญ่เมื่อย้ายไปคอมไพล์?
แก้ไข: ไม่เหมือนคำถามที่คล้ายกันเช่นการย้าย repo SVN หลาย GB ไปยัง Git หรือ /programming/540535/managing-large-binary-files-with-git สถานการณ์ของฉันไม่เกี่ยวข้องกับโครงการย่อยหลายโครงการ สามารถแปลงเป็น submoduels คอมไพล์ได้อย่างง่ายดายหรือไฟล์ไบนารี่ขนาดใหญ่สองสามตัวที่เหมาะสำหรับ git-annex มันเป็นพื้นที่เก็บข้อมูลเดียวที่ไบนารีเป็นชุดทดสอบที่คู่กับรหัสแหล่งที่มาหลักของการแก้ไขเดียวกันแน่นเหมือนว่าพวกเขาเป็นสินทรัพย์เวลารวบรวมเช่นกราฟิก ฉันกำลังตรวจสอบการสลับพื้นที่เก็บข้อมูลขนาดกลาง / ขนาดใหญ่ (ผู้ใช้ 50 ราย, รุ่น 60k, ประวัติ 80GB, สำเนาทำงาน 2Gb) จาก svn เมื่อจำนวนผู้ใช้เพิ่มขึ้นมีจำนวนมากในลำตัวและคุณลักษณะมักจะแพร่กระจายออกไปในหลายคอมมิททำให้การตรวจสอบโค้ดทำได้ยาก นอกจากนี้หากไม่มีการแตกแขนงออกมาจะไม่มีวิธี "รหัส" ที่ไม่ดีออกความคิดเห็นสามารถทำได้หลังจากมีการผูกมัดลำต้นเท่านั้น ฉันกำลังตรวจสอบทางเลือก ฉันหวังว่าเราสามารถย้ายไปคอมไพล์ แต่ฉันมีปัญหาบางอย่าง ปัญหาของการซื้อคืนในปัจจุบันจนถึงขนาดของคอมไพล์คือขนาด มี cruft เก่าจำนวนมากอยู่ในนั้นและการทำความสะอาดด้วย - ฟิลเตอร์สาขาเมื่อแปลงเป็นคอมไพล์สามารถลดขนาดลงตามลำดับความสำคัญประมาณ 5-10GB นี่ยังใหญ่เกินไป เหตุผลที่ดีที่สุดสำหรับขนาดพื้นที่เก็บข้อมูลขนาดใหญ่คือมีเอกสารไบนารีจำนวนมากที่ถูกป้อนเข้าสู่การทดสอบ ไฟล์เหล่านี้แตกต่างกันระหว่าง. 5mb และ 30mb …
23 git  svn 

2
วิธีทั่วไปในการแปลงลูป (ในขณะ / สำหรับ) การเรียกซ้ำหรือจากการวนซ้ำเป็นลูป?
ปัญหานี้เน้นไปที่อัลกอริทึมเป็นหลักซึ่งอาจเป็นสิ่งที่เป็นนามธรรมและเป็นวิชาการ ตัวอย่างคือการเสนอความคิดฉันต้องการวิธีการทั่วไปดังนั้นตัวอย่างจะใช้เพื่อทำให้เราชัดเจนยิ่งขึ้นเกี่ยวกับความคิดของคุณ โดยทั่วไปแล้วการวนซ้ำสามารถแปลงเป็นแบบวนซ้ำได้ เช่น: for(int i=1;i<=100;++i){sum+=i;} และ recursive ที่เกี่ยวข้องคือ: int GetTotal(int number) { if (number==1) return 1; //The end number return number+GetTotal(number-1); //The inner recursive } และท้ายที่สุดเพื่อลดความซับซ้อนนี้จำเป็นต้องเรียกซ้ำแบบหาง: int GetTotal (int number, int sum) { if(number==1) return sum; return GetTotal(number-1,sum+number); } อย่างไรก็ตามกรณีส่วนใหญ่นั้นไม่ใช่เรื่องง่ายที่จะตอบและวิเคราะห์ สิ่งที่ฉันอยากรู้คือ: 1) เราสามารถหา "วิธีการทั่วไปทั่วไป" ในการแปลงลูป (สำหรับ / ในขณะที่……) เป็นแบบเรียกซ้ำได้หรือไม่? …

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