-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcodern-report.tex
More file actions
3262 lines (3082 loc) · 461 KB
/
Copy pathcodern-report.tex
File metadata and controls
3262 lines (3082 loc) · 461 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
%%%%%%%%%%%%%%%%%%%%%%%% TEMPLATE INFO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%: Template Name = cpe-thesis-th
%: Version Name = th-vectier-1.1
%: Created by:
%: - Peerapon Siripongwutikorn (peerapon@cpe.kmutt.ac.th), 2016-2020
%: Modified by:
%: - Thanin Srithai (thanin.srithai2@mail.kmutt.ac.th), 2021-2022
%: - Jatetanan Kanchanawat (jate@jate-koh.com), 2024
%: - Vectier (support@vectier.com), 2024
%:
%: This is a LaTeX template for use in CPE, KMUTT report and thesis.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%: Instructions:
%: Run at the command line, run: xelatex <filename>.tex
%: Note: Run a few times to generate the output pdf file
%:
%%%%%%%%%%%%%%%%%%%%%%%%%% FILE INFO %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%: File name = report.tex
%: Authors:
%: - Jatetanan Kanchanawat
%: - Krid Hepakrone
%:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%% REPORT START %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[12pt,one side,openright,a4paper]{cpe-thesis-th}
%%%%%%%%%%%%%%%%%%%%%% Packages and Configs %%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{color}
\usepackage{pgfgantt} % Gantt chart
\usepackage{polyglossia}
\usepackage{caption} % Figures and tables captions
\usepackage{etoolbox} % Patching commands for macros creating i.e. preto
\usepackage{longtable} % Long continuous table
\usepackage{ragged2e} % Forcing figure
\usepackage{float} % ER and checkmark
\usepackage{tikz} % Drawing graphs and symbols
\usepackage{subfig} % Subfigures
\usepackage{keyval} % Subfigures alignment
\usepackage[export]{adjustbox} % Subfigures aLignment
\usepackage{cleveref} % Clever label references
\usepackage{lmodern}
\usepackage{listings} % Listings as code blocks
\usepackage{packages/listings-golang} % Listings support for Golang
\usepackage{packages/listings-yaml} % Listing support for YAML
%: Biblatex for managing bibliography; instead of using old \bibliography{}
%: NOTE: Biblatex define typesetting onto compilation cache.
%: So recompile from scratch (Remove aux and bbl file and recompile)
%: Everytime you stopped using biblatex
\usepackage[
backend=biber, % Biber or Bibtex
style=ieee, % Bib standard
sorting=none, % Sort by appearance in paper
% sorting=ynt, % Sort by year, name...
% sortcites=true, % Some other example options ...
dateabbrev=true,
urldate=long,
block=none,
indexing=false,
citereset=none,
isbn=true,
url=true,
doi=true, % Prints DOI
natbib=true % if you need Natbib functions
]{biblatex}
%%%%%%%%%%%%%%%%%% Custom Macros & Settings %%%%%%%%%%%%%%%%%%%%%%%
%: From this part to \begin{document}
%: Do not modify unless you know what you are doing...
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% Biblatex macro %%%%%%%%%%
%: Setup URL access date string
\DefineBibliographyStrings{english}{%
urlseen = {accessed}
}
%: Reference bib files
%: Make sure you reference correct bib file...
\addbibresource{bib/codern.bib}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%% Font settings %%%%%%%%%
%: Define 1st and 2nd language
\setdefaultlanguage{thai}
\setotherlanguage{english}
%: Uncomment following to used Laksaman
%: which is equivalent of Sarabun
% \setmainfont[
% Scale=1.0,
% LetterSpace=0,
% WordSpace=1.0,
% FakeStretch=1.0,
% Mapping=tex-text
% ]{Laksaman:script=thai}
% \newfontfamily\thaifont[
% Scale=1.0,
% LetterSpace=0,
% WordSpace=1.0,
% FakeStretch=1.0,
% Mapping=tex-text
% ]{Laksaman:script=thai}
% \newfontfamily\thaifonttt{Tlwg Typist:script=thai}
%: Uncomment to use actual Sarabun (font file required)
\newfontfamily\thaifont[Script=Thai,Scale=1.23]{THSarabunNew.ttf}[
Path=fonts/,
Extension=.ttf,
BoldFont=*-Bold,
ItalicFont=*-Italic,
BoldItalicFont=*-BoldItalic,
]
\defaultfontfeatures{Mapping=tex-text,Scale=1.23,LetterSpace=0.0}
\setmainfont[Scale=1.23,LetterSpace=0,WordSpace=1.0,FakeStretch=1.0,Mapping=tex-text]{THSarabunNew.ttf}[
Path=fonts/,
Extension=.ttf,
BoldFont=*-Bold,
ItalicFont=*-Italic,
BoldItalicFont=*-BoldItalic,
]
%: Set linebreak to Thai
\XeTeXlinebreaklocale "th"
\XeTeXlinebreakskip = 0pt plus 0pt
\emergencystretch=10pt
%: Define fonts for code blocks
\newfontfamily\codefont[Scale=0.9]{CourierPrime.ttf}[
Path=fonts/,
Extension=.ttf,
BoldFont=*-Bold,
ItalicFont=*-Italic,
BoldItalicFont=*-BoldItalic,
]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%% Margin settings %%%%%%%%
%\linespread{1.6} % Double-spaced
%\oddsidemargin 0.5in
%\evensidemargin 0.5in
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% Paragraph Settings %%%%%%%
\linespread{1.15}
\newcommand{\thaijustify}[1]{%
% \ifnum\value{isfigure}=0
% \newline % If counter is set, no newline
% \fi
\par\hspace{30pt}\justifying
#1
% \vspace{1mm}
% \setcounter{isfigure}{0}%
}
\newcommand{\thaicaption}[1]{%
% \ifnum\value{isfigure}=0
% \newline % If counter is set, no newline
% \fi
\par\justifying
#1
% \vspace{1mm}
% \setcounter{isfigure}{0}%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% Caption settings %%%%%%%%%
%: Define how the captions of each report
%: element are formatted.
\captionsetup[table]{
format=hang,
labelfont=bf,
position=top,
labelsep=space,
justification=justified,
singlelinecheck=true
}
\captionsetup[figure]{
format=hang,
labelfont=bf,
position=bottom,
labelsep=space,
justification=justified,
singlelinecheck=true
}
\captionsetup[subfloat]{
format=hang,
labelfont=bf,
labelformat=simple,
labelsep=period,
justification=justified,
singlelinecheck=true
%listofformat=subparens
}
\captionsetup[lstlisting]{
format=hang,
labelfont=bf,
position=top,
labelsep=space,
justification=justified,
singlelinecheck=true,
skip=10pt
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% Numbering styling %%%%%%%
% Enumerate using arabic numbers
\renewcommand{\labelenumii}{\arabic{enumi}.\arabic{enumii}}
\renewcommand{\labelenumiii}{\arabic{enumi}.\arabic{enumii}.\arabic{enumiii}}
\renewcommand{\labelenumiv}{\arabic{enumi}.\arabic{enumii}.\arabic{enumiii}.\arabic{enumiv}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% Subfigure settings %%%%%%%
%\renewcommand{\subfigtopskip}{10pt}
%\renewcommand{\subfigbottomskip}{-5pt}
%\renewcommand{\subfigcapskip}{-6pt} %vertical space between caption
% %and figure.
%\renewcommand{\subfigcapmargin}{0pt}
% Use thai alphabets for captions
\renewcommand{\thesubfigure}{\thalph{subfigure}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%% Tikz Settings %%%%%%%%%%
%: Tikz is used for drawing simple edge and node graph
%: Import shapes for usage
\usetikzlibrary{er, positioning, shapes.geometric, arrows}
%: Define checkmark symbol
\def\checkmark{\tikz\fill[scale=0.4](0,.35) -- (.25,0) -- (1,.7) -- (.25,.15) -- cycle;}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%% Listings Settings %%%%%%%%
%: Listings is used for displaying the program or
%: codes in reports as statement
%: Define text color for code blocks
\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{mauve}{rgb}{0.58,0,0.82}
%: Define code blocks settings
\lstset{
frame=tb,
language=Golang,
aboveskip=3mm,
belowskip=3mm,
showstringspaces=false,
columns=flexible,
basicstyle={\small\codefont},
numbers=left,
numberstyle=\small\color{gray},
keywordstyle=\color{blue},
commentstyle=\color{dkgreen},
stringstyle=\color{mauve},
breaklines=false,
breakatwhitespace=false,
tabsize=3
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%% Math macro %%%%%%%%%%%
%: Fraction settings
\renewcommand{\topfraction}{0.85}
\renewcommand{\textfraction}{0.1}
%: Define theorem and proof
\newtheorem{theorem}{Theorem}
\newtheorem{lemma}{Lemma}
\newtheorem{corollary}{Corollary}
\def\QED{\mbox{\rule[0pt]{1.5ex}{1.5ex}}}
\def\proof{\noindent\hspace{2em}{\itshape Proof: }}
\def\endproof{\hspace*{\fill}~\QED\par\endtrivlist\unskip}
%\newenvironment{proof}{{\sc Proof:}}{~\hfill \blacksquare}
%% The hyperref package redefines the \appendix. This one
%% is from the dissertation.cls
%\def\appendix#1{\iffirstappendix \appendixcover \firstappendixfalse \fi \chapter{#1}}
%\renewcommand{\arraystretch}{0.8}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%% Report Definitions %%%%%%%%%%%%%%%%%%%%%%%%%%
%: Customize below to suit your needs
%: The optional ones can be left blank.
%: First line of title
\def\disstitleone{Coding Platform}
\def\thaidisstitleone{Coding Platform}
%: Second line of title
\def\disstitletwo{Code Autograding System for C/C++ Program Verification}
\def\disstitlethree{using Golang and Containerization Technology}
\def\thaidisstitletwo{ระบบตรวจงานเขียนชุดคำสั่งโปรแกรมภาษาคอมพิวเตอรสำหรับการตรวจโปรแกรมภาษา }
\def\thaidisstitlethree{C หรือ C++ โดยภาษาคอมพิวเตอร์ Golang และเทคโนโลยี Containerization}
%: Authors
\def\dissauthor{Mr. Krid Heprakrone} % 1st member
\def\thaidissauthor{นายกฤษฎิ์ เฮ่ประโคน}
\def\dissauthortwo{Mr. Jatetanan Kanchanawat} % 2nd member (optional)
\def\thaidissauthortwo{นายเจตนันท์ กาญจนวัฒน์}
\def\dissauthorthree{Ms. Pimmada Laisuan} % 3rd member (optional)
\def\thaidissauthorthree{นางสาวพิมพ์มาดา ไล่สวน}
%: The degree that you're pursuing..
\def\dissdegree{Bachelor of Engineering} % Name of the degree
\def\thaidissdegree{วิศวกรรมศาสตรบัณฑิต}
\def\dissdegreeabrev{B.Eng} % Abbreviation of the degree
\def\dissyear{2023} % Year of submission
\def\thaidissyear{2566} % Year of submission (B.E.)
%: Your project or independent study's committee
%: Example of appropriate advisor/committee name entries
%: Example 1: Assoc. Prof. Natasha Dejdumrong, D. Tech. Sci.
%: Example 2: Asst. Prof. Dr.Ing Priyakorn Pusawiro
%: Example 3: Jaturon Harnsomburana, Ph.D.
%: Advisors
\def\dissadvisor{Assoc. Prof. Natasha Dejdumrong, D. Tech. Sci.} % Advisor
\def\thaidissadvisor{รศ.ดร.ณัฐชา เดชดำรง}
%: Note: Leave the following empty if you have no co-advisor
\def\disscoadvisor{} % Co-advisor (optional)
\def\disscoadvisortwo{} % Co-advisor (optional)
\def\thaidisscoadvisor{}
\def\thaidisscoadvisortwo{}
%: Committee Members
%: Note: Leave the following empty if no person is in that position
\def\disscommitteetwo{Asst. Prof. Dr.Ing Priyakorn Pusawiro} % 3rd committee member
\def\disscommitteethree{Asst. Prof. Rajchawit Sarochawikasit} % 4th committee member (optional)
\def\disscommitteefour{Jaturon Harnsomburana, Ph.D.} % 5th committee member (optional)
%: Project Type
\def\worktype{Project} % Project or Independent study
\def\thaiworktype{ปริญญานิพนธ์} % Project or Independent study
\def\disscredit{3} % 3 credits or 6 credits
%: Department Information
\def\fieldofstudy{Computer Engineering}
\def\department{Computer Engineering}
\def\faculty{Engineering}
\def\thaifieldofstudy{วิศวกรรมคอมพิวเตอร์}
\def\thaidepartment{วิศวกรรมคอมพิวเตอร์}
\def\thaifaculty{วิศวกรรมศาสตร์}
%%%%%%%%%%%%%%%%% Front Page + Signature Page %%%%%%%%%%%%%%%%%%
\begin{document}
\pdfstringdefDisableCommands{
\let\MakeUppercase\relax
}
\begin{center}
\includegraphics[width=2.8cm]{./figure/logo02.jpg}
\end{center}
\vspace*{-1cm}
\maketitlepage
\makesignaturepage
%%%%%%%%%%%%%%%%%%%%%% English abstract %%%%%%%%%%%%%%%%%%%%%%%%
\abstract
Proficiency in computer programming is a vital skill in computer science, leading to a surge in student enrollment for programming courses. However, the effectiveness of teaching programming diminishes as class sizes increase, and instructors find it challenging to manually assess each student's assignments promptly. To address this issue, we propose developing a software solution, Coding Platform, a code auto-grading system written in Golang utilizing containerization technology, designed to automate and streamline the grading process. This software aims to evaluate student submissions against predefined test cases, measure resource usage efficiency, and instantly provide feedback and scores. This reduces the burden on instructors and fosters a competitive and engaging learning environment. The platform also maintains a comprehensive record of student performance, aiding both instructors in refining their teaching methods and students in showcasing their achievements. The software had been deployed for its intended use and has, ever since, been tested by both instructors and students alike, in classroom environments and competitive scenes like BangMod Hackathon 2024. Consequently, this grading system has been updated and refined actively as users' bug reports and feature requests are always addressed followed by various updates, fixes, and patches. Overall, the software was very well-received, with survey results averaging an overall score of 8 and good user ratings on the software's functionalities and performance.
\justifying
\begin{tabular*}{\textwidth}{@{}lp{0.8\textwidth}}
\textbf{Keywords}: & Programming Education / Student Assessment / Golang / Containerization
\end{tabular*}
\vspace{1mm}
\endabstract
%%%%%%%%%%%%%%%%%%%%%%%% Thai abstract %%%%%%%%%%%%%%%%%%%%%%%%%
\thaiabstract
\justifying
ความเชี่ยวชาญในการเขียนโปรแกรมคอมพิวเตอร์เป็นทักษะสำคัญในวิทยาการคอมพิวเตอร์ ส่งผลให้ในช่วงมาหลังมีนักศึกษาหันมาสนใจและลงทะเบียนในหลักสูตรการเขียนโปรแกรมเพิ่มมากขึ้น ส่งผลให้ประสิทธิภาพของการสอนการเขียนโปรแกรมจะลดลงเนื่องจากจำนวนผู้เรียนเพิ่มมากขึ้น อาจารย์ผู้สอนพบว่าการประเมินงานมอบหมายของนักเรียนแต่ละคนด้วยตนเองเป็นเรื่องท้าทาย เพื่อแก้ไขปัญหานี้ คณะผู้จัดทำเสนอเเนวทางเเก้ไขปัญหาในรูปเเบบของซอฟต์แวร์ชื่อ Coding Platform ขี้นมาด้วยภาษา Golang และออกแบบด้วยเทคโนโลยี Containerization ระบบซอฟต์แวร์ดังกล่าวจะเป็นระบบสำหรับตรวจโปรแกรมที่นักศึกษาเขียนส่งมาในระบบ แล้วให้ผลตรวจในทันที ซอฟต์แวร์ดังกล่าวจะตรวจและประเมินงานที่ผู้ใช้ส่งมาเทียบกับกรณีทดสอบที่กำหนดไว้ล่วงหน้าและวัดประสิทธิภาพการใช้ทรัพยากรของตัวโปรแกรม จากนั้นจะนำผลตรวจด้งกล่าวไปแสดงในทันที สิ่งนี้ไม่เพียงแต่ช่วยลดภาระของผู้สอนเท่านั้น แพลตฟอร์มดังกล่าวยังรักษาบันทึกผลเเละข้อมููลการใช้งานของผู้ใช้อย่างครอบคลุมเพื่อนำมาเป็นข้อมูลให้อาจารย์ผู้สอนปรับปรุงวิธีการสอนของตน และจัดแสดงความสำเร็จของนักศึกษาเพื่อส่งเสริมสภาพแวดล้อมการเรียนรู้ที่มีการแข่งขันและการมีส่วนร่วม โดยซอฟต์แวร์ดังกล่าวได้ถูกติดตั้งใช้งานแล้ว ซึ่งได้เปิดโอกาสให้ผู้ใช้ทั้งอาจารย์ผู้สอนและนักศึกษาได้ลองใช้งาน ทั้งในห้องเรียนและกิจกรรมวิชาการอย่าง BangMod Hackathon 2024 รวมไปถึงให้ผู้ใช้ได้วิจารณ์และให้คำติชมเพื่อที่จะได้นำไปปรับปรุงและแก้ไขข้อผิดพลาด ซึ่งส่งผลให้ซอฟต์แวร์นั้นได้รับผลตอบรับที่ดีจากผู้ใช้มากมายในแบบประเมินผล ดัวยคะแนนเฉลี่ยของภาพรวมซอฟต์แวร์ที่ 8 คะแนน พร้อมผลคะแนนและคำชมเชยมากมายในด้านความสามารถและประสิทธิภาพการทำงานของซอฟต์แวร์
\justifying
\begin{tabular*}{\textwidth}{@{}lp{0.8\textwidth}}
& \\
\textbf{คำสำคัญ}: & รายวิชาการสอนเขียนโปรแกรม / การวัดและประเมินผลนักศึกษา / ภาษา Golang / เทคโนโลยี Containerization
\end{tabular*}
\vspace{1mm}
\endabstract
%%%%%%%%%%%%%%%%%%%%%%%%% Acknowledgments %%%%%%%%%%%%%%%%%%%%%%
\preface
โครงงานพัฒนาโปรแกรม/แอปพลิเคชัน/เว็บแอปพลิเคชัน สำหรับตรวจงานและข้อสอบในรายวิชาการเรียนการสอนเขียนโปรแกรมภาษาคอมพิวเตอร์ หรือ Coding Platform สามารถบรรลุเป้าหมายไปได้ด้วยดี ทางคณะผู้จัดทำต้องขอขอบคุณผู้สนับสนุนทุกท่านที่ให้การช่วยเหลือในด้านต่าง ๆ ขอขอบคุณ รศ.ดร.ณัฐชา เดชดำรง ที่มาเป็นอาจารย์ที่ปรึกษาโครง สละเวลาในการให้ความรู้ พร้อมให้คำแนะนำตลอดการพัฒนาทั้งโครงงาน ขอขอบคุณภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าธนบุรี ที่ให้การส่งเสริมและสนับสนุนทางคณะผู้จัดทำ ตลอดจนเอื้อเฟื้อสถานที่และอุปกรณ์สำหรับการพัฒนาโครงงาน ขอขอบคุณนักศึกษาชั้นปีที่หนึ่งและสอง ที่เรียนวิชา CPE222 Algorithm Design, CPE100 Computer Programming for Engineers, CPE112 Programming with Data Structures ปีการศึกษาพุทธศักราช 2566 รวมไปถึงนักเรียนชั้นมัธยมศึกษาตอนปลายที่เข้าร่วมโครงการกิจกรรมการเเข่งขันเขียนโปรเเกรมคอมพิวเตอร์ Bangmod Hackathon 2024 ที่จัดขึ้นในปีการศึกษาเดียวกัน ที่สละเวลามาทดลองใช้ซอฟต์เเวร์ต้นแบบ พร้อมทั้งแสดงความเห็น ให้่ข้อเสนอแนะ ให้คำติชมที่ล้วนแต่เป็นข้อมูลอันเป็นประโยชน์ ที่สามารถนำมาใช้ในการพัฒนาซอฟต์แวร์
%%%%%%%%% Table of Contents, List of Figures/Tables %%%%%%%%%%%%
%: The three commands below automatically generate the table
%: of content, list of tables, list of figures, and list of listings
%: Appendices or Appendix
%: If you have more than one appendix, use `Appendices`
\def\appendixnames{Appendices}
\tableofcontents
\listoftables
\listoffigures
%%%%%%%%%%%%%%%%%%%%%%%% List of codes %%%%%%%%%%%%%%%%%%%%%%%%%
%: Command below automatically will generate the table
%: for listing 'lst' package listings
\listofprograms
%%%%%%%%%%%%%%%%%%%%%%%% List of symbols %%%%%%%%%%%%%%%%%%%%%%%
%: You have to add this manually...
% \listofsymbols
% \newline\justifying{
% \begin{tabular}{@{}p{0.07\textwidth}p{0.7\textwidth}p{0.1\textwidth}}
% \textbf{สัญลักษณ์} & & \textbf{หน่วย} \\[0.2cm]
% $\alpha$ & Test variable\hfill & m$^2$ \\
% $\lambda$ & Interarival rate\hfill & jobs/second\\
% $\mu$ & Service rate\hfill & jobs/second\\
% \end{tabular}
% }
%%%%%%%%%%%%%%%%%%%%% List of vocabs & terms %%%%%%%%%%%%%%%%%%%
%: You also have to add this manually...
\newcommand{\tableraglf}[1]{\RaggedRight{#1}}
\listofvocab
\begin{flushleft}
\begin{tabular}{@{}p{2in}@{\hspace{0.1in}=\extracolsep{0.2in}}p{4in}}
% Application / แอปพลิเคชัน & \tableraglf{โปรแกรมหรือซอฟต์แวร์คอมพิวเตอร์สำหรับรูปแบบหนึ่งรูปแบบใด~\cite{oxfordlearner} หรือโปรแกรมซอฟต์แวร์ที่ทำงานอยู่บนระบบสารสนเทศ~\cite{cnssi4009}} \\
% Code / โค้ด & \tableraglf{คำสั่งคอมพิวเตอร์และคำจำกัดความของข้อมูลที่แสดงเป็นภาษาโปรแกรมหรือในรูปแบบเอาต์พุตโดยแอสเซมเบลอร์ คอมไพลเลอร์ หรือนักแปลอื่น ๆ~\cite{cnssi4009}} \\
% Source Code / รหัสต้นฉบับ / ซอร์สโค้ด / รหัสต้นทาง & \tableraglf{ชุดของข้อความที่ถูกเขียนขึ้นด้วยภาษาโปรแกรมที่มนุษย์สามารถอ่านและเข้าใจได้~\cite{linfo04}} \\
PDF & \tableraglf{ย่อมาจาก Portable Document File แปลว่ารูปแบบไฟล์เอกสารที่สามารถเคลื่อนย้ายไปมาได้อย่างสะดวก} \\ %~\cite{nist8219, nistsp800pdf}
UI / ส่วนประสานงานผู้ใช้ & \tableraglf{ย่อมาจาก User Interface ในภาษาอังกฤษ หมายถึงส่วนที่ให้ผู้ใช้งานสามารถโต้ตอบกับการใช้งานผลิตภัณฑ์ได้ ซึ่งจะมุ่งเน้นไปที่เรื่องของหน้าตา การออกแบบ เช่น หน้าจอ แพลตฟอร์ม เมนู ฟอร์ม} \\ %~\cite{nistsp800ui} ~\cite{dmit19ui}
UX / ประสบการณ์ของผู้ใช้ & \tableraglf{ย่อมาจาก User Experience ในภาษาอังกฤษ ประสบการณ์ของผู้ใช้งานในด้านความรู้สึกที่ตอบสนองต่อการใช้งานผลิตภัณฑ์ หรือระบบต่าง ๆ ยกตัวอย่างเช่น ความสะดวกสบาย ใช้งานง่าย ความสนุกสนาน} \\ %~\cite{dmit19ui} ~\cite{nistsp800ui}
MD & \tableraglf{ย่อมาจากคำว่า Markdown ซึ่งเป็นภาษา Markup ที่เรียบง่าย ที่มีความคล้ายคลึงกับภาษามนุษย์ โดยหลักการเขียนอิงตามแบบแผนข้อความธรรมดา (plain text) ที่ผ่านการทดสอบและรวบรวมเป็นมาตรฐาน อิงจากข้อมูลที่เก็บเป็นช่วงเวลา 40 ปีที่ผ่านมา} \\ %~\cite{atwoodmd}
Compiler / คอมไพลเลอร์ & \tableraglf{ซอฟต์แวร์ที่แปลภาษาโปรแกรมคอมพิวเตอร์ระดับสูงที่คนเข้าใจ ให้อยู่ในรูปแบบภาษาที่คอมพิวเตอร์สามารถดำเนินการได้} \\ %~\cite{astmcompiler}
% Inherit (Object) / สืบทอด (วัตถุ) & \tableraglf{ในเชิงการเขียนโปรแกรมเชิงวัตถุ หมายถึง (วัตถุ) สืบทอดคุณสมบัติจากอีกวัตถุหนึ่ง} \\
% Implements (Object) / ปฏิบัติตาม (วัตถุ) & \tableraglf{ในเชิงการเขียนโปรแกรมเชิงวัตถุ หมายถึง การปฏิบัติตามคุณสมบัติหรือกฏเกณฑ์ของอีกวัตถุ (โดยเฉพาวัตถุประเภท Interface)} \\
Run (Program) / รัน (โปรแกรม) & \tableraglf{ในเชิงของการเขียนโปรแกรมและซอฟต์แวร์ แปลว่าการนำชุดคำสั่งหรือชุดของโค้ดหรือโปรแกรม ไปเปิดใช้งาน} \\
Grader / เกรดเดอร์ & \tableraglf{ตัวโปรแกรมหรือซอฟต์แวร์ที่จะเอาโปรแกรมที่เขียนมาไปลองรันทดสอบ แล้วเทียบเทสเคสกับค่าผลลัพธ์ที่แสดงออก เพื่อตัดสินและประเมินความถูกต้องของโปรแกรม} \\
Test Case / กรณีทดสอบโปรแกรม / เทสเคส & \tableraglf{ชุดของค่าอินพุต เงื่อนไขเบื้องต้นในการดำเนินการ ผลลัพธ์ที่คาดหวัง และเงื่อนไขหลังการดำเนินการ พัฒนาขึ้นสำหรับ วัตถุประสงค์เฉพาะหรือเงื่อนไขการทดสอบ} \\ %~\cite{istqb}}
Assignment / โจทย์ปัญหา / ข้อสอบ / การบ้าน & ในรายงานนี้ หมายถึงโจทย์ปัญหาที่เป็นปัญหาในเชิงอัลกอริทึม ที่จะต้องแก้โจทย์ด้วยการเขียนโปรแกรมภาษาคอมพิวเตอร์ป้อนเข้าไปเพื่อให้คอมพิวเตอร์แก้ไขปัญหาให้ \\
Memory Limit / ขีดจำกัดหน่วยความจำ & \tableraglf{ปริมาณทรัพยากรการคำนวณ ที่โปรแกรมสามารถใช้ได้ ในการประมวลผลหาคำตอบของโจทย์ปัญหาเชิงโปรแกรม} \\
Time Limit / ระยะเวลาจำกัด & \tableraglf{ระยะเวลามากที่สุด ที่โปรแกรมใช้ได้ในการประมวลผล หาคำตอบสำหรับโจทย์ปัญหาเชิงโปรแกรม} \\
\end{tabular}
\end{flushleft}
%\setlength{\parskip}{1.2mm}
%%%%%%%%%%%%%%%%%%%%%%% Main body %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{บทนำ}
\section{ที่มาและความสำคัญ}
\thaijustify{
ทักษะการเขียนโปรแกรมคอมพิวเตอร์เป็นทักษะที่สำคัญสำหรับวิชาชีพในสาขาวิทยาการคอมพิวเตอร์ เป็นเหตุให้นักศึกษาจำนวนมากหันมาสมัครหรือลงวิชาเขียนโปรแกรมคอมพิวเตอร์เพิ่มมากขึ้น ทำให้การเรียนการสอนวิชาเขียนโปรแกรมคอมพิวเตอร์มีประสิทธิภาพที่ต่ำลงเพราะจำนวนผู้เรียนมากขึ้น อาจารย์ผู้สอนไม่สามารถจะดูแลนักศึกษาได้ครบทุกคน การตรวจงานและให้คะแนนใช้ระยะเวลานาน เพราะอาจารย์ผู้สอนจะต้องนำไฟล์งานของนักศึกษามาตรวจทีละไฟล์ อีกทั้งยังมีโอกาสเกิดข้อผิดพลาดในการตรวจอีกด้วย
}
\thaijustify{
จากปัญหาดังกล่าว กลุ่มผู้จัดทำได้มีแนวทางแก้ปัญหาด้วยการสร้างเป็นโครงงานพัฒนาซอฟต์แวร์ Coding Platform เพื่อให้อาจารย์ผู้สอนได้นำไปใช้เป็นเครื่องมือช่วยตรวจงานของนักศึกษาโดยอัตโนมัติ ด้วยแนวทางนี้อาจารย์ผู้สอนจะได้ไม่ต้องทุ่มเททรัพยากรและเวลาไปกับการตรวจการบ้าน แล้วสามารถที่จะทุ่มเทไปยังงานในด้านการสอน และพัฒนาคุณภาพการเรียนการสอนในรายวิชา
}
\thaijustify{
โดยซอฟต์แวร์จะนำไฟล์ชุดคำสั่งที่นักศึกษาส่งเข้ามาในระบบ มาตรวจสอบความถูกต้องจากชุดข้อมูลทดสอบ (Test Case) ที่อาจารย์ผู้สอนได้กำหนดไว้ในโจทย์แต่ละข้อ จากนั้นนำไปวัดและประเมินประสิทธิภาพของการใช้ทรัพยากรของโปรแกรมเช่น ระยะเวลาหรือปริมาณหน่วยความจำที่ถูกโปรแกรมใช้ในประมวลผลหาคำตอบ หลังจากตรวจเสร็จ ระบบจะบันทึกผลลัพธ์และแสดงผลลัพธ์การตรวจให้นักศึกษาได้เห็นในทันที เพื่อเสริมสร้างความสนุกสนาน การแข่งขันและส่งเสริมนักศึกษาให้พัฒนาตนเอง อีกทั้งประวัติการใช้งาน งานทั้งหมดที่นักศึกษาได้ส่ง จะถูกนำไปเก็บไว้ในระบบฐานข้อมูลผู้ใช้อีกด้วย เพื่อให้อาจารย์ผู้สอนไปใช้การปรับปรุงหรือพัฒนาการสอนต่อๆ ไป หรือเพื่อให้นักศึกษานำเอาผลงานที่ได้ทำในระบบ ไปยื่นประกอบกับพอร์ทโฟลิโอในฐานะหลักฐานและผลงานความสำเร็จ
}
\section{วัตถุประสงค์}
ทางกลุ่มคณะผู้จัดทำ ได้ดำเนินโครงการพัฒนาซอฟต์เเวร์ดังกล่าว ด้วยวัตถุประสงค์ดังต่อไปนี้
\begin{enumerate}
\item เพื่อนำความรู้การบริหารจัดการงานด้านซอฟต์แวร์จากวิชาวิศวกรรมซอฟต์เเวร์ มาประยุกต์ใช้กับการทำงาน
\item เพื่อสร้างโอกาสทดลอง ออกแบบและสร้างซอฟต์แวร์ขนาดใหญ่ ในระดับมืออาชีพ
\item เพื่อนำหลักการออกเเบบในทางวิศวกรรม ที่เรียนมาจากรายวิชาของภาควิชาวิศวกรรมคอมพิวเตอร์ มาออกเเบบสร้างระบบซอฟต์เเวร์ที่มั่นคงและยั่งยืน
\item เพื่อช่วยอาจารย์ผู้สอนตรวจงาน วัดและประเมินแบบฝึกหัด การบ้าน หรือข้อสอบนักศึกษาในรายวิชาการเขียนโปรแกรมคอมพิวเตอร์
\item เพื่อช่วยคณะกรรมการหรือคณะผู้จัดการแข่งขันเขียนโปรแกรม ตรวจข้อสอบในโครงการแข่งขันเขียนโปรแกรมคอมพิวเตอร์ที่จัดขึ้นในภาควิชา
\item เพื่อเก็บข้อมูลการเรียนการสอน ทั้งโจทย์ปัญหาและการบ้านที่นักศึกษาได้ทำ และผลสอบของนักศึกษาเข้าฐานข้อมูลผู้ใช้ เพื่อให้อาจารย์ผู้สอนไปใช้อ้างอิงและพัฒนาคุณภาพการสอนต่อๆ ไป
\end{enumerate}
\section{ขอบเขตของโครงงาน}
\begin{enumerate}
\item ซอฟต์แวร์รองรับการแสดงผลเป็นภาษาอังกฤษ
\item ซอฟต์แวร์เน้นการใช้งานบนหน้าจอ Desktop
\item มีระบบลงทะเบียนหรือยืนยันตัวตนผู้ใช้ (User registration and Authentication System)
\item มีหน้าแสดงโจทย์ปัญหา ให้นักศึกษา/ผู้เข้าร่วมการแข่งขัน/ผู้ใช้ทั่วไปดู
\begin{enumerate}
\item รองรับการแสดงโจทย์แบบ Markdown, ไฟล์ PDF, และรูปภาพ
\end{enumerate}
\item มีแผงสำหรับเขียนโปรแกรมหรือแก้ไขโค้ด (Built-in code editor) คู่กับโจทย์ ในหน้าแสดงโจทย์
\item มีระบบคอมไพลเลอร์สำหรับรันโปรแกรมที่ส่งเข้ามา (Built-in code compiler)
\begin{enumerate}
\item รองรับภาษา C และ C++ เป็นหลัก
\item คอมไพลเลอร์รันโปรแกรมที่ส่งเข้ามา เพื่อตรวจสอบความถูกต้องในขั้นตรวจงาน (Grading)
\item คอมไพลเลอร์รันโปรแกรมเพื่อแสดงผลลัพธ์ให้นักศึกษาดู ในหน้าแผงเขียนโปรแกรมเพื่อตรวจโปรแกรมก่อนส่ง (debugging)
\end{enumerate}
\item มีระบบตรวจและประเมินโค้ดที่ได้ส่งเข้ามา (Automatic grader and Evaluation) โดยประเมินจาก
\begin{enumerate}
\item ความถูกต้อง (Correction) โดยเทียบชุดข้อมูลส่งออก (Output) ของโปรแกรมกับชุดข้อมูลทดสอบ (Test case) ที่กำหนดไว้ในโจทย์ข้อนั้นๆ
\item ประสิทธิภาพ (Performance) ประเมินโดยเทียบกับตัวแปร/ตัวชี้วัด (Metrics) ต่อไปนี้
\begin{itemize}
\item ระยะเวลาที่ใช้ในการหาคำตอบ (Runtime)
\item ปริมาณหรือจำนวนหน่วยความจำที่โปรแกรมใช้ (Memory usage)
\end{itemize}
\end{enumerate}
\item มีระบบห้องเรียน/กลุ่มเรียน/กลุ่มงาน (Class/Group/Workspace) ตามรายวิชาสำหรับเก็บโจทย์
\item มีแผงควบคุมสำหรับอาจารย์/ผู้สอน/แอดมิน (Admin/Instructor/Lecturer Dashboard) โดยในแผงควบคุมดังกล่าวอาจารย์/ผู้สอน/แอดมินสามารถ
\begin{enumerate}
\item สร้าง/แก้ไข/ลบ แอคเคาน์นักศึกษา/ผู้เข้าร่วมการแข่งขัน/ผู้ใช้ทั่วไปได้
\item สร้าง/แก้ไข/ลบ ห้องเรียนหรือกลุ่มงานหรือกลุ่มเรียนได้
\item เพิ่ม/ลบ นักศึกษา/ผู้เข้าร่วมการแข่งขัน/ผู้ใช้ทั่วไปเข้าห้องเรียนหรือกลุ่มงานหรือกลุ่มเรียนได้
\item เพิ่ม/แก้ไข/ลบ โจทย์ปัญหาได้ และสามารถกำหนดเงื่อนไขของโจทย์แต่ละข้อได้ เช่นหน่วยความจำที่อนุญาตให้ใช้มากที่สุด (Memory limit), ช่วงเวลาที่โปรแกรมควรให้คำตอบ (Runtime limit) หรือ Library ที่อนุญาตให้ใช้ ฯลฯ
\end{enumerate}
\item รองรับการใส่ข้อมูลทดสอบ (Test case) ของโจทย์แต่ละข้อ ที่ประกอบด้วย
\begin{enumerate}
\item ชุดข้อมูลนำเข้า (Input) ผ่าน Standard input
\item ชุดข้อมูลส่งออก (Output) ผ่าน Standard output
\end{enumerate}
\item มีแผงควบคุมสำหรับนักศึกษา/ผู้เข้าร่วมการแข่งขัน/ผู้ใช้ทั่วไป (Student/User dashboard) โดยในแผงควบคุมดังกล่าวนักศึกษา/ผู้เข้าร่วมการแข่งขัน/ผู้ใช้ทั่วไปสามารถเข้าไปเขียนโปรแกรมแก้โจทย์ปัญหาในห้องเรียน/กลุ่มเรียน/กลุ่มงานที่ตนอยู่ได้
\item มีฐานข้อมูลหรือระบบเก็บรวบรวมข้อมูลผู้ใช้ (User database) ที่จะเก็บประวัติการใช้งาน โจทย์ปัญหาที่ได้ทำ ไว้ใช้อ้างอิงต่อไป
\item มีระบบตารางคะแนน (Scoreboard) ประจำห้องเรียน/กลุ่มเรียน/กลุ่มงาน ที่แสดงลำดับของนักศึกษา/ผู้เข้าร่วมการแข่งขัน/ผู้ใช้ทั่วไปในกลุ่มนั้นๆ
\end{enumerate}
%: NOTE: This should not be included in thesis, but in proposals
% \section{ประโยชน์ที่คาดว่าจะได้่รับ}
% หลังจากสิ้นสุดโครงการ ทางคณะผู้จัดทำคาดหวังว่า โครงการดังกล่าวจะให้ผลประโยชน์ต่อทั้งตนเเละผู้อื่น ดังต่อไปนี้
% \begin{enumerate}
% \item ทางคณะผู้จัดทำจะได้รับข้อคิด บทเรียนเเละประสบการณ์อันเป็นประโยชน์ต่อชีวิตการทำงานในอนาคต จากการบริหารจัดการ การวางเเผน การออกเเบบเเละสร้างซอฟต์เเวร์ตัวนี้
% \item อาจารย์ผู้สอนในรายวิชาการเขียนโปรแกรมคอมพิวเตอร์ จะได้รับความสะดวกสบาย สามารถตรวจงาน วัดและประเมินผลนักศึกษาได้อย่างรวดเร็วเเละมีประสิทธิภาพ
% \item คณะกรรมการเเละคณะผู้จัดการแข่งขันเขียนโปรแกรมในภาควิชา จะสามารถตรวจข้อสอบเเข่งขันได้อย่างรวดเร็ว สามารถประกาศผลเเข่งขันได้ในทันทีเเละเกิดข้อผิดพลาดน้อยที่สุด
% \item ทางภาควิชาวิศวกรรมคอมพิวเตอร์ จะสามารถนำข้อมูลการใช้งาน ข้อมูลคะเเนนเเละการวัดผล ข้อมูลการเรียนการสอนจากระบบซอฟต์เเวร์ดังกล่าวไปพัฒนาหลักสูตรเเละคุณภาพการสอนได้
% \end{enumerate}
\pagebreak
\section{ตารางการดำเนินงาน}
\thaijustify{
ในส่วนนี้เป็นแผนและตารางเวลาของแต่ละขั้นตอน ในโครงการออกแบบระบบซอฟต์แวร์ที่ทางกลุ่มเราได้วางขึ้นมา สรุปอยู่ในรูปของ Gantt Chart เพื่อใช้สำหรับเป็นจุดอ้างอิง เพื่อที่จะใช้ติตตามผลและความก้าวหน้าของโครงการ รวมไปถึงประเมินผลการดำเนินการและประสิทธิภาพการทำงานของกลุ่ม
}
\begin{table}[!h]
\centering
\caption{ตารางการดำเนินการในภาคการศึกษาที่ 1}
\label{tbl:gantt1}
\begin{ganttchart}[
x unit = 0.5cm,
y unit chart = 1.2cm,
y unit title = 0.6cm,
title height = 1,
vgrid={*{3}{black, dotted}, *1{black, dashed}},
hgrid={*1{black, dashed}},
bar top shift = 0.1,
%bar height = 0.8,
bar label node/.append style={
align=right,
text width=width("7. จัดทำรายงานของภาคการศึกษาที่ 1")
}
]{1}{20}
\gantttitle{สิงหาคม}{4} \gantttitle{กันยายน}{4} \gantttitle{ตุลาคม}{4} \gantttitle{พฤศจิกายน}{4} \gantttitle{ธันวาคม}{4} \\
\gantttitlelist{1,...,4}{1} \gantttitlelist{1,...,4}{1} \gantttitlelist{1,...,4}{1} \gantttitlelist{1,...,4}{1} \gantttitlelist{1,...,4}{1} \\
\ganttbar{ศึกษาค้นคว้า วิเคราะห์หาปัญหาและที่มา}{2}{2} \\
\ganttbar{เสนอหัวข้อโครงงาน}{3}{3} \\
\ganttbar{ศึกษาค้นคว้า หาข้อมูลที่เกี่ยวข้อง}{3}{4} \\
\ganttbar{นำเสนอโครงการให้กับอาจารย์ที่ปรึกษา}{4}{4} \\
\ganttbar{จัดทำข้อเสนอโครงการ}{5}{9} \\
\ganttbar{นำเสนอข้อเสนอโครงการ}{11}{11} \\
\ganttbar{จัดทำรายงานของภาคการศึกษาที่ 1}{5}{16} \\
\ganttbar{วิเคราะห์และออกแบบ UX/UI}{6}{16} \\
\ganttbar{พัฒนาซอฟต์แวร์และระบบ}{11}{20} \\
\ganttbar{ทดสอบการทำงานของระบบ จากการใช้งานจริงครั้งที่ 1}{17}{20} \\
\ganttbar{นำเสนอและรายงานโครงการของภาคการศึกษาที่ 1}{17}{18} \\
\end{ganttchart}
\end{table}
\begin{table}[!h]
\centering
\caption{ตารางการดำเนินการในภาคการศึกษาที่ 2}\label{tbl:gantt2}
\begin{ganttchart}[
x unit = 0.5cm,
y unit chart = 1.2cm,
y unit title = 0.6cm,
title height = 1,
vgrid={*{3}{black, dotted}, *1{black, dashed}},
hgrid={*1{black, dashed}},
bar top shift = 0.1,
%bar height = 0.8,
bar label node/.append style={
align=right,
text width=width("7. จัดทำรายงานของภาคการศึกษาที่ 1")}
] {1}{20}
\gantttitle{มกราคม}{4} \gantttitle{กุมภาพันธ์}{4} \gantttitle{มีนาคม}{4} \gantttitle{เมษายน}{4} \gantttitle{พฤษภาคม}{4} \\
\gantttitlelist{1,...,4}{1} \gantttitlelist{1,...,4}{1} \gantttitlelist{1,...,4}{1} \gantttitlelist{1,...,4}{1} \gantttitlelist{1,...,4}{1} \\
\ganttbar{พัฒนาซอฟต์แวร์และระบบ (ต่อจากภาคการศึกษาที่ 1)}{2}{8} \\
\ganttbar{ทดสอบการทำงานของระบบ จากการใช้งานจริงครั้งที่ 2}{7}{12} \\
\ganttbar{จัดทำและส่งรูปเล่มรายงานฉบับกลางภาค}{9}{12} \\
\ganttbar{ปรับปรุงและแก้ไขซอฟต์แวร์และระบบเพิ่มเติม}{9}{16} \\
\ganttbar{จัดทำและส่งรายงานโครงการฉบับสมบูรณ์}{14}{19} \\
\ganttbar{นำเสนอโครงการ}{18}{20} \\
\end{ganttchart}
\end{table}
\pagebreak
%%%%%%%%%%%%%%%%%%%%%% Literature Review %%%%%%%%%%%%%%%%%%%%%%%
\chapter{ทฤษฎีความรู้และงานที่เกี่ยวข้อง}
\thaijustify{
ในบทที่ 2 จะกล่าวถึง ทฤษฎีที่เกี่ยวข้องที่ใช้ในการทำงานและการศึกษาเพื่อบรรลุวัตถุประสงค์ อธิบายคำศัพท์หรือภาษาทางคอมพิวเตอร์ เทคโนโลยีที่จะนำมาประยุกต์ใช้งานและแก้ปัญหาต่าง ๆ ในโครงการ รวมกล่าวบรรยายไปถึงงานวิจัย ผลิดภัณฑ์ หรือโครงงานที่นำมาใช้อ้างอิงในโครงการนี้
}
\section{ทฤษฎีที่เกี่ยวข้อง}
\thaijustify{
ในโครงงานพัฒนาซอฟต์แวร์นี้ กลุ่มคณะผู้จัดทำได้มีการศึกษาค้นคว้าทฤษฎี แนวคิดและหลักการเขียนโปรแกรมรูปแบบต่าง ๆ มา เพื่อจะนำเอาองค์ประกอบและเกร็ดความรู้ต่าง ๆ เหล่านี้ ไปประยุกต์ใช้ในขั้นตอนการสร้างซอฟต์แวร์โครงการ ซึ่งได้เขียนบรรยายไว้เป็นหัวข้อดังต่อไปนี้
}
\subsection{ทฤษฎีการเขียนโปรแกรมแบบเชิงวัตถุ}
\thaijustify{
ทฤษฎีการเขียนโปรแกรมเชิงวัตถุ (Object-Oriented Programming Theory) เป็นแนวคิดในการออกแบบและพัฒนาซอฟต์แวร์ที่เน้นการแบ่งงานออกเป็นองค์ประกอบที่มีลักษณะคล้ายกับวัตถุจริง ๆ ในโลกทั่วไป ถ้าอิงจากวัตถุในชีวิตจริงก็แสดงว่า วัตถุนั้นมีสถานะ (State), พฤติกรรม (Behavior) และความสัมพันธ์ (Relationship) ระหว่างกัน~\cite{booch87} ในการใช้ทฤษฎีเชิงวัตถุในการพัฒนาซอฟต์แวร์ เราสามารถสร้างองค์ประกอบหรือวัตถุที่มีความสมบูรณ์และเป็นรูปแบบสำหรับแก้ปัญหาแต่ละประเภทได้อย่างมีประสิทธิภาพ~\cite{meyer2000}
}
\thaijustify{
การใช้ทฤษฎีเชิงวัตถุมีข้อได้เปรียบหลายประการ เช่นช่วยลดความซับซ้อนของโค้ดหรือทำให้การบำรุงรักษาซอฟต์แวร์ง่ายขึ้น (Maintainability) เพิ่มความยืดหยุ่นในการพัฒนา (Extendability) และเปิดโอกาสในการนำวัตถุที่มีอยู่แล้วในซอฟต์แวร์มาใช้งานใหม่ (Reusability) การแบ่งงานเป็นวัตถุ (หรือ Object) ย่อย ๆ ทำให้โค้ดมีโครงสร้างที่เรียบง่ายและเป็นระเบียบ เพราะฉะนั้นทำให้การทำงานของโปรแกรมเป็นไปอย่างมีประสิทธิภาพและมั่นคง~\cite{meyer2000}
}
\begin{figure}[H]
\centering
\includegraphics[width=7cm]{figure/literature/oop-programming.png}
\caption[แผนผังองค์ประกอบของ OOPs]{แผนผังองค์ประกอบของการเขียนโปรแกรมแบบเชิงวัตถุ จาก~\cite{apollo22oop}}
\label{fig:oop-concept}
\end{figure}
\thaijustify{
องค์ประกอบของระบบโปรแกรมแบบเชิงวัตถุ (รูปที่~\ref{fig:oop-concept}) หรือ Object-Oriented Program System (หรือเรียกโดยย่อว่า OOPs) มีองค์ประกอบดังต่อไปนี้
}
\subsubsection{Objects และ Classes}
\thaijustify{
วัตถุในเชิงของทฤษฎีนี้ คือขอบเขตข้อมูล (Data Field) ที่มีคุณสมบัติและพฤติกรรมเฉพาะ (Specific Properties and Behavior)~\cite{apollo22oop} วัตถุนั้นถมีความยืดหยุ่นเพื่อให้สอดคล้องกับวัตถุในโลกแห่งความเป็นจริง (Real-world Object) หรือสิ่งของเชิงนามธรรม (Abstract Entities)
}
\begin{figure}[H]
\centering
\includegraphics[width=6cm]{figure/literature/oop-class-object.jpg}
\caption[แผนผังอธิบายความสัมพันธ์ระหว่างวัตถุและคลาส]{แผนผังอธิบายความสัมพันธ์ระหว่างวัตถุและคลาส จาก~\cite{moses22obj}}
\label{fig:oop-class-obj}
\end{figure}
\thaijustify{
สิ่งเหล่านี้เป็นวัตถุชั่วขณะ (หรือ Instances) สร้างขึ้นมาจากคลาส (Class) ซึ่งเปรียบเสมือนเป็นแม่พิมพ์หรือแบบแปลน (Blueprint) ที่สร้างขึ้นด้วยการใส่ค่าเริ่มต้นข้อมูลบางอย่างเข้าไปตอนเรียกการสร้าง (Instantiates) ตามรูปที่~\ref{fig:oop-class-obj}~\cite{apollo22oop}
}
\subsubsection{หลักการ Inheritance ของ Objects}
\thaijustify{
การสืบทอดคุณลักษณะวัตถุ (หรือ Inheritance) เป็นกลไกของการสร้างวัตถุหรือคลาส โดยใช้ลักษณะจากวัตถุอื่น (Prototype-based Inheritance) หรือจากคลาส (Class-based Inheritance) การสร้างวัตถุหรือคลาสด้วยวิธีดังกล่าว จะคงไว้ซึ่งการใช้งาน ลักษณะและพฤติกรรมที่คล้ายคลึงกัน คลาสที่สร้างขึ้นมาจะถูกนิยามว่าคลาสย่อย (Subclass) และเรียกคลาสที่เป็นต้นแบบของคลาสย่อยว่าคลาสพื้นฐานหรือซุปเปอร์คลาส (Base Class or Superclass)~\cite{johnson88classobj}
}
\begin{figure}[H]
\centering
\includegraphics[width=9cm]{figure/literature/oop-inheritance.jpg}
\caption[แผนผังอธิบายประเภทของการสร้างวัตถุด้วยการสืบทอดชนิดต่าง ๆ]{แผนผังอธิบายประเภทของการสร้างวัตถุด้วยการสืบทอด (Inheritance) ชนิดต่าง ๆ จาก~\cite{sakpal18inheritance}}
\label{fig:oop-inheritance}
\end{figure}
\thaijustify{
ใน~\cite{sakpal18inheritance} ได้แบ่งการสร้างวัตถุโดยการสืบทอดนั้นเป็น Single / Multiple / Hybrid ขึ้นกับจำนวนวัตถุที่วัตถุลูกสืบทอด หรือ Multilevel ถ้าหากคุณสมบัติของวัตถุถูกสืบทอดโดยวัตถุลูกมามากกว่าหนึ่งครั้งหรือหนึ่งชั้น หรือเรียกว่า Hierarchial ถ้าวัตถุชิ้นนั้นถูกสืบทอดโดยวัตถุลูกมากกว่าหนึ้งคลาส ตามรูปที่~\ref{fig:oop-inheritance} แต่ละภาษาโปรแกรมคอมพิวเตอร์มีการสนับสนุนการสร้างวัตถุด้วยการสืบทอดนั้นไม่เหมือนกัน ยกตัวอย่างเช่นภาษา Java นั้น ใช้ได้แค่ Single, Multilevel, และ Hierarchical Inheritance เท่านั้น, ภาษา C++ สามารถที่จะใช้ Multiple Inheritance ได้~\cite{stroustrup94inheritance} เป็นต้น
}
\subsubsection{หลักการ Polymorphism}
\thaijustify{
จาก~\cite{javapolymorph} หลักการ Polymorphism เป็นการนำหลักการทางชีววิทยาที่กล่าวว่า "สิ่งมีชีวิตหรือสปีชีส์สามารถมีได้หลายรูปแบบหรือระยะต่าง ๆ" มาประยุกต์ ใช้งานในการเขียนโปรแกรมเชิงวัตถุ โดยถูกนำมาใช้เป็นหลักการจัดสร้างระบบประสานงานกับวัตถุอื่น (Object Interface) อันเดียวในคลาสหรือวัตถุใดๆ แต่ส่วนประสานดังกล่าวนั้น มีความพิเศษที่มันสามารถอนุญาตให้วัตถุหรือตัวตน (Entities) ประเภทอื่น ๆ มาเข้าใช้งาน
}
\thaijustify{
คำว่า Polymorphism มาจากรากศัพท์ภาษาอังกฤษสองคำ; Poly แปลว่า มากมาย และ Morph แปลว่า รูปร่าง ดังนั้น เมื่อเราพูดถึงความหลากหลายในการเขียนโปรแกรม มันก็เหมือนกับการบอกว่าบางสิ่งบางอย่างสามารถมีได้หลายรูปแบบ ในการเขียนโปรแกรมเชิงวัตถุ (OOP) ความหลากหลายจะช่วยจัดการว่าส่วนต่างๆ ของโปรแกรมต้องพึ่งพาซึ่งกันและกันอย่างไร ช่วยให้การดำเนินการทำงานแตกต่างออกไปขึ้นอยู่กับข้อมูลที่กำลังทำงานอยู่~\cite{nzeruekenneth23polymorph}
}
\thaijustify{
ลองนึกภาพคุณมีฟังก์ชันที่สามารถทำสิ่งต่าง ๆ ได้ตามสถานการณ์ ตัวอย่างเช่น วัตถุ "รูปร่าง" อาจมีฟังก์ชัน "วาด" เมื่อเรียกคำสั่ง "วาด" บนวงกลม มันจะวาดวงกลม เมื่อเรียกคำสั่ง "วาด" บนสี่เหลี่ยมจัตุรัส มันจะวาดรูปสี่เหลี่ยมจัตุรัส นี่คือการกระทำที่มีความหลากหลาย - ฟังก์ชันเดียวกันจะมีพฤติกรรมแตกต่างกันไปขึ้นอยู่กับวัตถุที่ใช้คำสั่งนั้นด้วย~\cite{ntu20polymorph}
}
\begin{figure}[H]
\centering
\includegraphics[width=10cm]{figure/literature/oop-polymorphism.png}
\caption[แผนผังแสดงตัวอย่างของ Polymorphism ใน OOPs]{แผนผังแสดงตัวอย่างของ Polymorphism ใน OOPs จาก~\cite{ntu20polymorph}}
\label{fig:oop-polymorph}
\end{figure}
\thaijustify{
ใน~\cite{ntu20polymorph} ได้ให้รูปที่~\ref{fig:oop-polymorph} มาดูประกอบเป็นตัวอย่าง ถ้าในเกมของเรา เรามีมอนสเตอร์หลายประเภทที่สามารถโจมตีได้ เราจะออกแบบซูเปอร์คลาสที่เรียกว่า Monster และกำหนดวิธีการโจมตีในซูเปอร์คลาส (Superclass) จากนั้นคลาสย่อย (Subclass) ก็จะต้องนำกฎเกณฑ์ของซูเปอร์คลาสนำไปสร้างและปฏิบัติใหม่ (Implement) เป็นการโจมตีของมอนสเตอร์รูปแบบใหม่ แล้วในโปรแกรมหลัก หากเรียกใช้งานมอนสเตอร์ให้โจมตี มอนสเตอร์ก็จะโจมตีขึ้นกับประเภทของมอนสเตอร์นั้นที่กำลังโจมตี (FireMonster, WaterMonster หรือ StoneMonster)
}
\thaijustify{
จากตัวอย่างดังกล่าวจะเห็นได้ว่า การทำ Polymorphism ใน OOPs ทำให้โปรแกรมเมอร์สามารถเขียนโปรแกรมที่อินเทอร์เฟซในการออกแบบระบบที่ซับซ้อน คลาสย่อยจะมีคุณลักษณะและการดำเนินการทั้งหมด เหมือนกับซูเปอร์คลาส (เนื่องจากคลาสย่อยสืบทอดคุณลักษณะและการดำเนินการทั้งหมดจากซูเปอร์คลาส) ซึ่งหมายความว่าวัตถุในคลาสย่อยนั้น สามารถจะทำอะไรก็ได้ที่ซูเปอร์คลาสสามารถทำได้ ด้วยเหตุนี้ เมื่อเราใช้อินสแตนซ์ (Instance) ของซูปเปอร์คลาส มันสามารถที่จะทดแทนคลาสย่อยได้ และทุกอย่างจะทำงานได้ตามปกติ (เรียกคุณสมบัตินี้ใน OOPs ว่า Substitutability)~\cite{ntu20polymorph}
}
\thaijustify{
กล่าวสรุปก็คือ ความหลากหลายหมายความว่าวัตถุสามารถทำสิ่งต่าง ๆ ในสถานการณ์ที่แตกต่างกันได้ เช่นเดียวกับที่บุคคลสามารถเป็นสามี พ่อ หรือลูกชายได้ ขึ้นอยู่กับว่าพวกเขากำลังโต้ตอบด้วย วัตถุในการเขียนโปรแกรมสามารถมีบทบาทที่แตกต่างกัน ขึ้นอยู่กับบริบท~\cite{nzeruekenneth23polymorph}
}
\subsubsection{การทำ Abstraction}
\thaijustify{
เป็นการคลาสที่กฎเกณฑ์ คุณสมบัติ และความสัมพันธ์ที่ถูกนิยามขึ้นโดยไม่ขึ้นกับวัตถุทางกายภาพโดยตรง คือการสร้างหรือมองคลาสและวัตถุให้ที่เป็นโมเดลหรือต้นแบบ (Prototype or Model) นามธรรม ให้สอดคล้องกับโลกของความเป็นจริง~\cite{saladpukabstract}
}
\thaijustify{
ในการเขียนโปรแกรม Abstraction หมายถึงการแยกสิ่งที่ทำออกจากวิธีการทำ~\cite{liskov87abstaction} ลองนึกภาพคุณมีงานที่ต้องทำให้เสร็จ เช่น การอบเค้ก เราไม่จำเป็นต้องรู้ทุกรายละเอียดเกี่ยวกับวิธีการทำงานของเตาอบ เพียงแค่ต้องรู้วิธีใช้มันอบเค้ก ในทำนองเดียวกัน ในการเขียนโปรแกรม วิธีแรกในการสรุปสิ่งต่าง ๆ เรียกว่า "ขั้นตอน"
}
\thaijustify{
ขั้นตอนก็เหมือนกับสูตรการอบเค้ก เป็นชุดคำสั่งที่ทำงานหรือฟังก์ชันเฉพาะ หากต้องการทำงานนั้นในโปรแกรม เพียงแค่เรียกใช้ขั้นตอนเช่นเดียวกับการทำตามสูตรในการอบเค้ก ไม่จำเป็นต้องกังวลเกี่ยวกับวิธีการเขียนขั้นตอนหรือสิ่งที่เกิดขึ้นภายในนั้น ตราบใดที่ขั้นตอนนี้ทำในสิ่งที่ควรจะทำอย่างถูกต้องและมีประสิทธิภาพ คุณก็สามารถใช้มันในโปรแกรมของคุณได้โดยไม่จำเป็นต้องเข้าใจรายละเอียดทั้งหมดเกี่ยวกับวิธีการทำงานของมัน การแยกระหว่างสิ่งที่ทำและวิธีการทำทำให้การเขียนโปรแกรมง่ายขึ้นและจัดการได้ง่ายขึ้น
}
\subsubsection{การทำ Encapsulation}
\thaijustify{
Encapsulation เป็นเหมือนการรวมข้อมูลและฟังก์ชันเข้าด้วยกัน จากงานศึกษาค้นคว้าของ \textit{Nzerue-Kenneth et al.}~\cite{nzeruekenneth23polymorph} เหมือนกับการใส่ไว้ในแคปซูลป้องกัน แนวคิดหลักคือการซ่อนความซับซ้อนของ Objects จากโปรแกรมและผู้ใช้ ทำให้ใช้งานได้ง่ายขึ้น มันคือทั้งหมดที่เกี่ยวกับการซ่อนการทำงานภายในของโค้ดไว้ ดังนั้นจึงไม่ต้องกังวลเกี่ยวกับวิธีการทำงาน แค่ใช้งานอย่างเดียวเท่านั้น
}
\begin{figure}[H]
\centering
\subfloat[การเปรียบเทียบการทำ Encapsulation กับยาแคปซูล~\cite{raut22encapsule}]{
\fbox{\includegraphics[width=6cm]{figure/literature/oop-encapsulation.png}}
\label{fig:oop-encapsulation-capsule}
}
\subfloat[การทำ Encapsulation เพื่อปกปิดคุณสมบัติของคลาส~\cite{nishad22encapsulation}]{
\fbox{\includegraphics[width=6cm]{figure/literature/oop-encapsulation-detail.jpg}}
\label{fig:oop-encapsulation-details}
}
\caption[แผนผังอธิบายการทำ Encapsulation]{แผนผังอธิบายการทำ Encapsulation}
\label{fig:oop-encapsulation}
\end{figure}
\thaijustify{
จากบทความของ \textit{Raut A.}~\cite{raut22encapsule} ได้เปรียบเทียบหลักการนี้กับแคปซูลที่ปกป้องยาที่อยู่ภายใน ตามในรูปที่~\ref{fig:oop-encapsulation-capsule} การห่อหุ้มของแคปซูลจะปกป้องข้อมูลและฟังก์ชันในโปรแกรม มันเชื่อมโยงโค้ดและข้อมูลที่มันทำงานด้วย สร้างเกราะป้องกันล้อมรอบพวกมัน ด้วยการห่อหุ้ม คุณสามารถจำกัดการเข้าถึงบางส่วนของออบเจ็กต์ โดยให้เฉพาะส่วนอื่น ๆ ของโปรแกรมเข้าถึงสิ่งที่พวกเขาต้องการเท่านั้น เหมือนกับมีตู้จำหน่ายสินค้าอัตโนมัติ คุณไม่สามารถเข้าไปซื้อขนมข้างในได้เว้นแต่คุณจะใช้ปุ่มของเครื่อง ในทำนองเดียวกัน ในการห่อหุ้ม ตัวแปรและฟังก์ชันของวัตถุจะถูกซ่อนไว้และสามารถเข้าถึงได้ผ่านวิธีการเฉพาะภายในคลาสของวัตถุนั้นเท่านั้น
}
\thaijustify{
ดังนั้น การทำ Encapsulation คือทั้งหมดที่เกี่ยวกับการเก็บรักษาสิ่งของต่างๆ ให้ปลอดภัยและซ่อนไว้ตามรูปที่~\ref{fig:oop-encapsulation-details} เช่นเดียวกับยาในแคปซูลหรือของว่างในตู้จำหน่ายสินค้าอัตโนมัติ ช่วยให้โปรแกรมใช้งานและเข้าใจได้ง่ายขึ้นโดยปกป้องการทำงานภายในของโปรแกรมเหล่านั้น~\cite{nishad22encapsulation}
}
\thaijustify{
จากที่กล่าวมา แม้ว่าจะฟังเหมือนว่าทฤษฎีหรือหลักการเขียนโปรแกรมเชิงวัตถุ จะสามารถทำให้การเขียนโปรแกรมและการสร้างซอฟต์แวร์ที่วับซ้อนดูง่ายขึ้น หลักการดังกล่าวก็มีข้อเสียเช่นกัน ข้อเสียเปรียบประการหนึ่งคือ ความง่ายดายต่อการถูกนำเอาไปแก้ไขปัญหาที่ง่าย (Over-engineer) นักพัฒนาอาจสร้างนามธรรม (Abstraction) ที่ไม่จำเป็นหรือลำดับชั้นที่ซับซ้อนซึ่งทำให้ Code base ยากต่อการเข้าใจและบำรุงรักษา โปรแกรมที่เขียนกลายเป็นของที่เข้าใจยากกว่าปัญหาที่ตนกำลังจะแก้~\cite{thomas99pragmatic} นอกจากนี้ การจัดการความสัมพันธ์ระหว่างคลาสและอ็อบเจ็กต์สามารถนำไปสู่การเชื่อมต่อที่แน่นแฟ้น ทำให้การแก้ไขหรือขยายโค้ดเป็นเรื่องที่ท้าทาย เพราะการเปลี่ยนแปลงโค้ด ณ จุดใดจัดหนึ่ง นั้นมีผลกระทบต่อส่วนอื่น ๆ ของระบบ~\cite{fowler13oop}
}
\thaijustify{
กลุ่มคณะผู้จัดทำได้มีประสบการณ์ในการเขียนโปรแกรมหรือซอฟต์แวร์ที่มีรากฐานของแนวคิดงมาจากแนวคิดหรือทฤษฎีเชิงวัตถุเป็นอย่างดี ยกกรณีตัวอย่างการเขียนหน้าเว็บที่ซับซ้อน หากมองมีลักษณะการเขียนในเชิงกึ่งวัตถุ ด้วยการมองชิ้นส่วนองค์ประกอบหรือส่วนประกอบของส่วนประสานงานหน้าเว็บไซต์ (Website UI Component) ตัวอย่างเช่น พวกปุ่มหรือช่องกรอกข้อมูลในฟอร์ม เป็นวัตถุชิ้นหนึ่ง ที่มีฟังก์ชันและค่าข้อมูลในตัว การมองเช่นนี้จะทำให้หน้าเว็บที่ซับซ้อนนั้นเข้าใจง่ายยิ่งขึ้น สามารถที่จะพัฒนาชิ้นส่วนและองค์ประกอบของหน้าเว็บได้อย่างง่ายได้ ทำให้ในขั้นตอนการพัฒนาซอฟต์แวร์ดำเนินไปได้สะดวกในระดับหนึ่ง เนื่องจากถ้าอิงจากหลักการดังกล่าว หากทำการเปลี่ยนแปลงลักษณะหรือโค้ดของวัตถุใดวัตถุหนึ่ง จะไม่กระทบกระเทือนวัตถุอื่นมากนัก เนื่องจากแต่ละวัตถุนั้นมีบทบาทหน้าที่แยกออกจากกันอย่างชัดเจน (โดยหลักการ SoC ที่ใช้ควบคู่กับ OOPs ที่จะพูดถึงและบรรยายในหัวข้อถัดไป)
}
\subsection{หลักการ Separation of Concern}
\thaijustify{
หลักการ Separation of Concern (หรือ SoC โดยย่อ) หรืออาจเรียกว่าหลักการออกแบบซอฟต์แวร์ด้วยการแบ่งแยกข้อกังวล เป็นแนวคิดการออกแบบหนึ่งในสาขาวิชาวิศวกรรมซอฟต์แวร์ โดยเน้นถึงความจำเป็นในการแบ่งระบบที่ซับซ้อนออกเป็นส่วนที่แตกต่างกันและจัดการได้ ซึ่งแต่ละส่วนจะกล่าวถึงลักษณะเฉพาะของฟังก์ชันการทำงาน (Function) หรือภาระหน้าที่ (Concern หรือ Responsibility)~\cite{nattawat20pgs}
}
\begin{figure}[H]
\centering
\includegraphics[width=6cm]{figure/literature/soc.png}
\caption[แผนผังแสดงหลักการ Separation of Concern]{แผนผังแสดงหลักการ Separation of Concern จาก~\cite{wikipedia04soc}}
\label{fig:soc-general}
\end{figure}
\thaijustify{
หลักการนี้มีบทบาทสำคัญในการปรับปรุงคุณภาพซอฟต์แวร์ การบำรุงรักษา และความสามารถในการขยาย~\cite{dijkstra82} ในขอบเขตของสถาปัตยกรรมซอฟต์แวร์ การแยกข้อกังวลมักจะเกี่ยวข้องกับการแบ่งระบบออกเป็นโมดูล (Modules) หรือส่วนประกอบ (Components) โดยแต่ละส่วนจะเกี่ยวข้องกับลักษณะเฉพาะของแอปพลิเคชันเช่น ส่วนติดต่อผู้ใช้ (User Interface) การจัดเก็บข้อมูล (Data Collections) หรือตรรกะทางธุรกิจ (Business Rules/Logic) แนวทางนี้จะลดการพึ่งพาซึ่งกันและกันระหว่างส่วนต่างๆ ของซอฟต์แวร์ ทำให้ง่ายต่อการพัฒนา แก้ไข และดีบักซอฟต์แวร์~\cite{wikipedia04soc} เนื่องจากการเปลี่ยนแปลงในด้านหนึ่งมีโอกาสน้อยที่จะส่งผลกระทบต่อส่วนอื่น ๆ มันส่งเสริมฐานรหัสที่มีการจัดระเบียบและเข้าใจได้มากขึ้น ซึ่งอำนวยความสะดวกในการทำงานร่วมกันระหว่างนักพัฒนา
}
\thaijustify{
หลักการนี้ถูกนำไปใช้ในการเขียนโปรแกรมแบบเชิงวัตถุ หรือ Object-Oriented Programming (การเขียนโปรแกรมด้วยการมองตัวไฟล์คำสั่งเป็นวัตถุหนึ่ง ๆ) ซึ่งเป็นการเขียนโปรแกรมหรือหลักการสร้างซอฟต์แวร์ที่นิยมเป็นอย่างมาก โดยเฉพาะอย่างยิ่งในซอฟต์แวร์ที่ซับซ้อน เห็นได้จากความเห็นของ \textit{Meyer}~\cite{meyer2000} ที่กล่าวว่า "หลักการดังกล่าวเป็นการสร้างซอฟต์แวร์ที่เป็นคุณภาพและมั่นคง มันทำให้รักษาความเข้าใจ, ความถูกต้องและประสิทธิภาพของแต่ละส่วนในระบบ" กล่าวคือการพัฒนาซอฟต์แวร์ใช้หลักการการแยกปัญหาและหน้าที่ของแต่ละองค์ประกอบที่ชัดเจน นำไปสู่การพัฒนาระบบซอฟต์แวร์ที่มีประสิทธิภาพและเครื่องมือที่มีคุณภาพสูง
}
\thaijustify{
ในโครงงานปริญญานิพนธ์ของ \textit{Jamlongrad et al.}~\cite{nattawat20pgs} ที่คณะผู้จัดทำใช้อ้างอิงเป็นหลักก็ได้มีการนำหลักการ Separation of Concern มาใช้ร่วมเช่นกัน เพราะเนื่องจากระบบของโครงการดังกล่าวนั้น เขียนขึ้นมาด้วยหลักการเขียนโปรแกรมเชิงวัตถุ หรือ Object-Oriented Programming เช่นเดียวกับกลุ่มคณะผู้จัดทำ
}
\subsection{หลักการ Version Control}
\thaijustify{
การทำ Version Control คือการจัดการซอร์สโค้ด (หรือ Source code) ซึ่งเป็นกระบวนการที่สำคัญในการพัฒนาซอฟต์แวร์ จำเป็นต้องมีการติดตามและการจัดการการเปลี่ยนแปลงใน Code base ของโครงการ~\cite{nattawat20pgs, rawat22versionctl}
}
\thaijustify{
โดยเครื่องมือดังกล่าวช่วยให้นักพัฒนาซอฟต์แวร์หลายคน สามารถทำงานร่วมกันในโครงการซอฟต์แวร์โดยจัดให้มีวิธีที่เป็นระบบในการติดตามการเปลี่ยนแปลงที่เกิดขึ้นกับซอร์สโค้ด แนวทางปฏิบัตินี้ช่วยเพิ่มองค์กร ความโปร่งใส และความเสถียรของโครงการซอฟต์แวร์ ช่วยให้นักพัฒนาสามารถดูและเข้าใจประวัติการเปลี่ยนแปลง แยกและแก้ไขปัญหา และจัดการงานที่เกิดขึ้นพร้อมกันได้อย่างมีประสิทธิภาพ~\cite{rawat22versionctl} หนึ่งในเครื่องมือ Version Control ที่นักพัฒนาหลายคนรู้จักและนิยมใช้ก็คือ Git ซึ่งปรากฎให้ใช้ในเว็บไซต์หรือเว็บแอปพลิเคชัน ที่ชื่อว่า GitHub กับ GitLab~\cite{chacon14}
}
\begin{figure}[H]
\centering
\includegraphics[width=9cm]{figure/literature/version-control.png}
\caption[แผนผังอธิบายการทำงานของระบบ Version control]{แผนผังอธิบายการทำงานของระบบ Version control จาก~\cite{rawat22versionctl}}
\label{fig:version-control}
\end{figure}
\thaijustify{
โดย Git เสนอแนวทางแบบกระจายและอเนกประสงค์ ซึ่งสนับสนุนการแยกสาขา (Branch) และการผสานรวม (Merge) ช่วยให้นักพัฒนาสามารถทำงานกับคุณสมบัติต่างๆ ได้พร้อมๆ กัน และรวมงานของพวกเขาได้อย่างราบรื่นในภายหลัง (ตามรูปที่~\ref{fig:version-control}) หลักการนี้จำเป็นสำหรับการรับประกันความสมบูรณ์ของโครงการซอฟต์แวร์โดยจัดให้มีกลไกในการเปลี่ยนกลับเป็น version ก่อนหน้า กู้คืนจากข้อผิดพลาด (Rollbacks) และรักษาประวัติการเปลี่ยนแปลงโค้ดที่เชื่อถือได้ ซึ่งทั้งหมดนี้มีส่วน ช่วยในการจัดการโครงการ และทำให้แน่ใจว่าการทำงานจะดำเนินไปอย่างราบรื่น
}
\thaijustify{
ในการพัฒนาซอฟต์แวร์หลายงาน หลายบริษัทและองค์กร รวมไปถึงโครงงานปริญญานิพนธ์ของ~\textit{๋Jamlongrad et al.}~\cite{nattawat20pgs} และ \textit{CodeForces}~\cite{codeforces} ล้วนแต่ใช้ระบบ Version Controlเป็นซอฟต์แวร์ตรวจโปรแกรมภาษาซีเหมือนกับโครงการของคณะผู้จัดทำ นั้น ก็ได้มีการนำหลักการ และเครื่องมือ Version Control มาใช้ร่วมเเละควบคู่กับการบริหารซอฟต์เเวร์ในโครงงาน เนื่องจากพัฒนาซอฟต์แวร์ต้องทำงานกันเป็นกลุ่ม การใช้ Version Control เข้ามาช่วยในการจัดการบริหารการเปลี่ยนแปลงของซอร์สโค้ด ช่วยให้การทำงานสะดวกยิ่งขึ้น ไม่เสียเวลากับการจัดการไฟล์ซอร์สโค้ดเองด้วยมือ แล้วสามารถเอาเวลาไปมุ่งเน้นกับการการพัฒนาโปรแกรม
}
\subsection{หลักการ Continuous Integration และ Continuous Delivery}
\thaijustify{
หลักการ Continuous Integration (CI) และ Continuous Delivery (CD) นิยมเรียกรวมกันโดยย่อว่าหลักการ CI/CD เป็นหลักการพื้นฐานในการพัฒนาซอฟต์แวร์สมัยใหม่ที่เน้นไปที่การพัฒนาซอฟต์แวร์ควบคู่กับการส่งมอบซอฟต์แวร์ไปสู่การผลิต (Production) โดยอัตโนมัติ เพื่อเสริมสร้างการทำงานซอฟต์แวร์ที่มีประสิทธิภาพและรวดเร็วให้ได้มากที่สุด
}
\thaijustify{
โดยเกี่ยวข้องกับการรวมการเปลี่ยนแปลงโค้ดทั้งหมดเข้ากับไปในพื้นที่เก็บข้อมูลที่ใช้ร่วมกัน Shared repository สม่ำเสมอ จากนั้นก็จะนำไปถูกสร้างขึ้นเป็นซอฟต์แวร์พร้อมใช้งาน หรือ Production build จากนั้นก็นำไปเข้าทดสอบหาข้อผิดพลาด (Test) ถ้าหากทดสอบผ่านก็จะนำเอาซอฟต์แวร์ดังกล่าวมาเปิดใช้ (Deploy) กับสภาพแวดล้อมต่างๆ (Environment) โดยอัตโนมัติ~\cite{fowlerCI}
}
\thaijustify{
แนวทางปฏิบัติหรือกระบวนการดังกล่าว จะช่วยเร่งกระบวนการทำงานและกระบวนการพัฒนาซอฟต์แวร์ ลดปัญหาในขั้นตอนการนำซอฟต์แวร์ไปจัดวางและเปิดใช้งาน และทำให้มั่นใจได้ว่าซอฟต์แวร์จะอยู่ในสภาพที่พร้อมใช้งานอยู่เสมอ โดยหลักการดังกล่าวจะนิยมไปใช้ควบคู่กับการ Version Control โดยเฉพาะบน Git
}
\thaijustify{
ตัวอย่างการใช้ ก็มีให้เห็นได้อย่างชัดเจนในโครงงานของ~\textit{๋Jamlongrad et al.}~\cite{nattawat20pgs} ในรายงานก็มีการใช้เครื่องมือที่ชื่อ Argo กับ Drone ในการทำ CI/CD โดยเครื่องมือดังกล่าวจะนำไฟล์งานซอฟต์แวร์ที่ได้เขียนไว้ (Development build) ไปสร้างเป็นซอฟต์แวร์พร้อมใช้งาน (Production Build) จากนั้นก็นำไปสร้างและจัดวาง (Deploy) เปิดใช้งานในเซิร์ฟเวอร์ปลายทาง
}
\subsection{ลักษณะการออกแบบโปรแกรมรูปแบบ Dependencies Injection}
\thaijustify{
Dependencies Injection หรือนิยมย่อกันว่า DI เป็นรูปแบบการออกแบบ (Design Pattern) ในที่ใช้กันทั่วไปในการพัฒนาซอฟต์แวร์เชิงวัตถุ เพื่อจัดการการขึ้นต่อกัน (Dependencies) ของคลาสหรือโมดูลโดยการนิยามหรือสร้างไว้ข้างนอก (Provided Externally) แทนที่จะสร้างข้างใน ใน DI การขึ้นต่อกันจะถูก "ฉีด" (หรือ Inject) เข้าไปในคลาสหรือโมดูลจากภายนอก กล่าวสั้น ๆ ง่าย ๆ โดยใช้คำนิยามของ \textit{Shore J.} ที่กล่าวว่า "Dependencies Injection หมายถึงการให้ตัวแปร Instance แก่วัตถุ"~\cite{shore06} ก็คือการใช่รูปแบบการออกแบบนี้ ก็แค่ให้ หรือฉีดข้อมูล ตัวแปร หรือฟังก์ชันเข้าไปในวัตถุที่ต้องการเองด้วยมือ ด้วยหนึ่งในวิธีการ Inject สามประเภทได้แก่การฉีดคอนสตรัคเตอร์ (Constructor) ตัวตั้งค่า (Setter) หรืออินเตอร์เฟส (Interface)
}
% TODO: Add example of deps injections
% Some sources
% - https://www.codeproject.com/Articles/615139/An-Absolute-Beginners-Tutorial-on-Dependency-Inver
% - https://deviq.com/practices/dependency-injection
\thaijustify{
วิธีการดังกล่าว ส่งเสริมให้การเชื่อมต่อที่หลวม (Loosely coupled) ระหว่างวัตถุ หรือส่วนประกอบต่าง ๆ ของโปรแกรม~\cite{fowlerDI} ซึ่งการที่วัตถุมีการเชื่อมต่อที่หละหลวมก็ทำให้เกิดข้อดีเช่นกัน อย่างเช่นทำให้โปรแกรมนั้นสามารแยกส่วนประกอบออกมาทดสอบได้ (Testability) สามารถที่จะนำ Unit test มาใช้ทดสอบซอฟต์แวร์หรือโปรแกรมดังกล่าวได้ ถ้าหากองค์ประกอบสามารถที่แยกส่วนประกอบออกได้อย่างชัดเจน อีกข้อดีหนึ่งก็คือซอฟต์แวร์หรือโปรแกรมนั้นจะสามารถบำรุงรักษาได้ง่าย (Maintainability) เพราะการเปลี่ยนแปลงโค้ดที่จุดใดจุดหนึ่งในซอฟต์แวร์จะไม่กระทบให้ส่วนอื่นเปลี่ยนแปลงไปมาก~\cite{freeman09}
}
\thaijustify{
ข้อดีอีกประการหนึ่งที่คณะผู้จัดทำให้ความสนใจเป็นพิเศษและอยากมาทดลองใช้ในโครงงาน เป็นข้อดีที่ผู้ใช้ที่มีนามสมมุติว่า \textit{Tiwari G.} (นามแฝงว่า \textit{gtiwari333}) ได้บอกใน \textit{Stack Overflow}~\cite{tiwaristackdi} คือการที่ Dependencies injection นั้นยอมให้ผู้พัฒนาฉีด Dependency แบบปลอม ๆ (Mock dependencies) เข้าไปในคลาสได้ แทนที่จะใช้ Dependencies ของจริง ด้วยวิธีการนี้ซอฟต์แวร์หรือโปรแกรมที่อยู่ในขั้นของการพัฒนา (Development phase) จะสามารถที่จะทดสอบ Dependency ส่วนที่ผู้พัฒนากำลังเขียนอยู่ได้ โดยไม่ต้องไปเปลี่ยนแปลงโค้ดส่วนอื่นที่ไม่ได้อยู่ในขอบเขตการทดสอบ โดยรวมทำให้การทำงานง่ายขึ้น
}
\thaijustify{
อย่างไรก็ตาม การใช้ Dependencies Injection ก็ยังมีข้อเสียที่อาจเกิดขึ้นเช่นกัน ตามที่ \textit{Toan T.} ได้ให้ความเห็นใน \textit{Stack Overflow}~\cite{toanstackdi} เมื่อใช้ Dependency Insert ข้อกังวลหลักคือความซับซ้อนที่เพิ่มขึ้น ซึ่งจะทำให้ทรัพยากรที่โปรแกรมหรือซอฟต์แวร์ดังกล่าวใช้เพิ่มมากขึ้น แม้ว่าเฟรมเวิร์ก DI จะทำให้กระบวนการจัดการการขึ้นต่อกันเป็นไปโดยอัตโนมัติ แต่ก็สามารถทำให้โค้ดของโปรแกรมซับซ้อนขึ้นเช่นกัน ทำให้อ่านเข้าใจยากขึ้น
}
\section{โครงงาน งานวิจัยหรือผลิตภัณฑ์ที่เกี่ยวข้อง}
เนื่องจากทางกลุ่มคณะผู้จัดทำพัฒนาซอฟต์แวร์ประเภทและรูปแบบนี้เป็นครั้งแรก ทางกลุ่มจึงต้องไปศึกษาหาซอฟต์แวร์อื่น ๆ ที่ทำงานและเปิดให้บริการด้านการตรวจงานเขียนภาษาโปรแกรมเช่นเดียวกับโครงการของคุณะผู้จัดทำ มาใช้อ้างอิงและวิเคราะห์หาข้อดีและข้อเสีย เพื่อนำมาประยุกต์ใช้ในขั้นตอนการสร้างซอฟต์แวร์โครงการนี้
\subsection{IPST Program Grader}
\thaijustify{
\href{https://programming.in.th}{IPST Program Grader} เป็นเว็บไซต์ แอปพลิเคชันที่สร้างขึ้นโดย\textit{สถาบันส่งเสริมการสอนวิทยาศาสตร์และเทคโนโลยี (สสวท.)}~\cite{ipstGrader} ถูกนำมาปรับปรุงใหม่โดยกลุ่มนักเรียนค่ายโอลิมปิกวิชาการคอมพิวเตอร์ในช่วงล่าสุดนี้ เว็บไซต์ดังกล่าวถูกสร้างขึ้นมาเพื่อให้ผู้ใช้สามารถเข้ามาฝึกฝนทักษะการเขียนโปรแกรม เรียนรู้การเขียนโปรแกรม เรียนรู้เกี่ยวกับโครงสร้างข้อมูล และฝึกเขียนอัลกอริทึมที่มีประสิทธิภาพ
}
\begin{figure}[H]
\centering
\subfloat[หน้าหลักเว็บไซต์ ณ วันที่ 10 ธันวาคม 2562~\cite{ipstGrader}]{
\includegraphics[width=7cm]{figure/literature/old-ipst.png}
\label{fig:ipst-page-old}
}
\subfloat[หน้าหลักเว็บไซต์ ณ ปัจจุบัน]{
\includegraphics[width=7cm]{figure/literature/current-ipst.png}
\label{fig:ipst-page-new}
}
\caption[หน้าหลักของ IPST Program Grader]{หน้าหลักของ IPST Program Grader}
\label{fig:ipst-page}
\end{figure}
\thaijustify{
เว็บไซต์นี้มีฐานข้อมูลโจทย์ปัญหาที่แต่งโดยทางสสวท. ที่ผู้ใช้สามารถกดเลือกเข้าไปทำข้อไหนก็ได้ มีระบบสมัครสมาชิก และมีแหล่งเรียนรู้เพิ่มเติม (Learning resource) สำหรับให้ผู้ใช้ได้เข้าอ่านทำความเข้าใจและเรียนรู้การเขียนโปรแกรม
}
\thaijustify{
เว็บไซต์ดังกล่าวเป็นหนึ่งในแรงบันดาลใจ ต้นฉบับความคิดและต้นแบบซอฟต์แวร์ที่ \textit{Program Grading System}~\cite{nattawat20pgs} ใช้เป็นตัวอย่างในเชิงของแนวคิดในการออกแบบซอฟต์แวร์
}
\thaijustify{
ใน \textit{Jamlongrad et al.}~\cite{nattawat20pgs} ได้มีการวิเคราะห์ สรุปข้อดีและข้อเสียของระบบ แต่เนื่องจากเว็บไซต์ได้มีการเปลี่ยนแปลงในรอบปีที่ผ่านมา คณะผู้จัดทำก็ได้ไปสำรวจการทำงานเว็บไซต์ใหม่อีกรอบหนึ่ง แล้วนำผลสำรวจมาสรุปรวบยอดกับในรายงานดังกล่าว สรุปเป็นผลเป็นตาราง~\ref{tbl:ipst-pro-cons} ดังต่อไปนี้
}
\begin{table}[H]
\centering
\caption{ข้อดีและข้อเสียของระบบ IPST Grader}
\label{tbl:ipst-pro-cons}
\begin{tabular}{p{1cm}|p{6cm}|p{6cm}} \hline\hline
ข้อที่ & ข้อดี & ข้อเสีย \\
\hline\hline
1. & \RaggedRight{เว็บไซต์มีระบบการตรวจและประเมินผลโปรแกรมที่รวดเร็ว ผู้ใช้สามารถรับรู้ผลได้ทันที}\par & \RaggedRight{เว็บไซต์ไม่สามารถจะใช้งานเครือข่ายเฉพาะได้ เพราะเว็บไซต์ดังกล่าวอยู่ในเครือข่ายสาธารณะ ทำให้เว็บไซต์นี้ไม่สามารถนำมาใช้ในการแข่งขันภายในได้}\par \\ \hline
2. & \RaggedRight{ส่วนประสานผู้ใช้ถูกออกแบบมาอย่างดี เพื่อความสะดวกสบายของผู้ใช้}\par & \RaggedRight{ไม่มีระบบสื่อสาร ไม่มีระบบกระทู้สนทนา ไม่มีช่องทางการสื่อสารให้ผู้ใช้ได้คุยปรึกษากันเรื่องโจทย์}\par \\ \hline
3. & \RaggedRight{เว็บไซต์มีโจทย์ปัญหาที่หลากหลาย แต่งแต่ระดับง่ายสุด ไปยังระดับการแข่งขันระดับนานาชาติ}\par & \RaggedRight{ผู้ใช้ไม่สามารถเพิ่มโจทย์ปัญหาเองได้ โจทย์ปัญหาถูกควบคุมและเพิ่มโดยผู้ดูแลเว็บเท่านั้น}\par \\ \hline
4. & \RaggedRight{เว็บไซต์มีระบบจัดหมวดหมู่โจทย์ปัญหา ทำให้ผู้ใช้หาโจทย์ปัญหาที่ต้องการทำได้ง่าย}\par & \\
\hline\hline
\end{tabular}
\end{table}
% IMPROVED TO TABLE
% \begin{itemize}
% \item \textbf{ข้อดี}
% \begin{enumerate}
% \item เว็บไซต์มีระบบการตรวจและประเมินผลโปรแกรมที่รวดเร็ว ผู้ใช้สามารถรับรู้ผลได้ทันที
% \item ส่วนประสานผู้ใช้ (user interface) ถูกออกแบบมาอย่างดี เพื่อความสะดวกสบายของผู้ใช้
% \item เว็บไซต์มีโจทย์ปัญหาที่หลากหลาย แต่งแต่ระดับง่ายสุด ไปยังระดับการแข่งขันระดับนานาชาติ
% \item เว็บไซต์มีระบบจัดหมวดหมู่โจทย์ปัญหา ทำให้ผู้ใช้หาโจทย์ปัญหาที่ต้องการทำได้ง่าย
% \end{enumerate}
% \item \textbf{ข้อเสีย}
% \begin{enumerate}
% \item เว็บไซต์ไม่สามารถจะใช้งานเครือข่ายเฉพาะได้ เพราะเว็บไซต์ดังกล่าวอยู่ในเครือข่ายสาธารณะ ทำให้เว็บไซต์นี้ไม่สามารถนำมาใช้ในการแข่งขันภายในได้
% \item ไม่มีระบบสื่อสาร ไม่มีระบบกระทู้สนทนา ไม่มีช่องทางการสื่อสารให้ผู้ใช้ได้คุยปรึกษากันเรื่องโจทย์
% \item ผู้ใช้ไม่สามารถเพิ่มโจทย์ปัญหาเองได้ โจทย์ปัญหาถูกควบคุมและเพิ่มโดยผู้ดูแลเว็บเท่านั้น
% \end{enumerate}
% \end{itemize}
\subsection{Codeforces}
\thaijustify{
ซอฟต์แวร์ \href{https://codeforces.com}{Codeforces} เป็นเว็บไซต์แอปพลิเคชัน ที่สร้างขึ้นโปรแกรมเมอร์ที่ชื่อ \textit{Mike Mirzayanov}~\cite{codeforces} ในปี 2553 สร้างขึ้นมาด้วยวัตถุประสงค์เดียวกับ programming.in.th เพื่อให้ผู้ใช้สามารถเข้ามาฝึกฝนทักษะการเขียนโปรแกรม เรียนรู้การเขียนโปรแกรม
}
\thaijustify{
เว็บไซต์นี้มีฐานข้อมูลโจทย์ปัญหาที่แต่งโดยทางผู้ดูแลเว็บไซต์เหมือนกับเว็บไซต์ programming.in.th ที่ผู้ใช้สามารถเข้าไปเลือกทำได้ แต่ข้อแตกต่างที่ทำให้เว็บไซต์นี้แตกต่างคือระบบการแข่งขัน ระบบตารางคะแนน
}
\begin{figure}[H]
\centering
\includegraphics[width=10cm]{figure/literature/codeforces.png}
\caption[หน้าหลักของ Codeforces]{หน้าหลักของ Codeforces ณ วันที่ 31 สิงหาคม 2566~\cite{codeforces}}\label{fig:codeforces-page}
\end{figure}
\thaijustify{
เว็บไซต์นี้มีการจัดการแข่งขันเป็นช่วง ๆ มีการจัดลำดับผู้เข้าแข่งขันด้วยระบบการตรวจและประเมินโปรแกรม คะแนนจะมากน้อยขึ้นกับสองปัจจัยหลัก ประกอบด้วยความถูกต้อง (Correction) และประสิทธิภาพ (Performance or efficiency) โปรแกรมที่ให้คำตอบที่ถูกต้อง ใช้ทรัพยากรน้อย และใช้เวลาหาคำตอบน้อยจะได้คะแนนสูง ผู้เข้าแข่งขันคนไหนที่สามารถแก้โจทย์ปัญหาได้ถูกต้องและมีประสิทธิภาพ มากที่สุดในเวลาที่จำกัดจะถือเป็นผู้ชนะ
}
\thaijustify{
จาก~\cite{nattawat20pgs} ก็ได้นำเอาซอฟต์แวร์ตัวนี้ไปทำการวิเคราะห์ และคัดสรรเลือกคุณลักษณะเด่นไปพัฒนาเช่นเดียวกัน โดยกลุ่มนักศึกษาเจ้าของโครงการดังกล่าวก็ได้สรุปข้อดีและข้อเสียของซอฟต์แวร์ Codeforces ไว้ตามตาราง~\ref{tbl:codeforces-pro-cons} ดังต่อไปนี้
}
\begin{table}[H]
\centering
\caption{ข้อดีและข้อเสียของระบบ Codeforces}\label{tbl:codeforces-pro-cons}
\begin{tabular}{p{1cm}|p{6cm}|p{6cm}} \hline\hline
ข้อที่ & ข้อดี & ข้อเสีย \\
\hline\hline
1. & \RaggedRight{เว็บไซต์มีระบบการตรวจและประเมินผลโปรแกรมที่รวดเร็ว ผู้ใช้สามารถรับรู้ผลได้ทันที}\par & \RaggedRight{เว็บไซต์ไม่สามารถจะใช้งานเครือข่ายเฉพาะได้ เพราะเว็บไซต์ดังกล่าวอยู่ในเครือข่ายสาธารณะ ทำให้เว็บไซต์นี้ไม่สามารถนำมาใช้ในการแข่งขันภายในได้}\par \\ \hline
2. & \RaggedRight{มีระบบตารางคะแนน มีการจัดอันดับคะแนนผู้ใช้ ส่งเสริมให้ผู้ใช้พัฒนาตนเอง ส่งเสริมให้เกิดการแข่งขัน}\par & \RaggedRight{ส่วนประสานผู้ใช้ออกแบบมาไม่ดี ไม่สะดวกต่อการใช้งาน}\par \\ \hline
3. & \RaggedRight{มีระบบสื่อสาร มีระบบกระทู้สนทนา มีช่องทางการสื่อสารให้ผู้ใช้ได้คุยปรึกษากันเรื่องโจทย์ มีช่องทางประกาศประชาสัมพันธ์ข่าวสารและผลการแข่งขัน}\par & \RaggedRight{}\par \\ \hline
4. & \RaggedRight{ผู้ใช้สามารถเพิ่มโจทย์ปัญหาเองได้ ถ้าหากได้รับอนุญาต รับบทบาทเป็นผู้ดูแลระบบจากเจ้าของเว็บไซต์}\par & \RaggedRight{}\par \\
\hline\hline
\end{tabular}
\end{table}
% IMPROVED TO TABLE
% \begin{itemize}
% \item \textbf{ข้อดี}
% \begin{enumerate}
% \item เว็บไซต์มีระบบการตรวจและประเมินผลโปรแกรมที่รวดเร็ว ผู้ใช้สามารถรับรู้ผลได้ทันที
% \item มีระบบตารางคะแนน มีการจัดอันดับคะแนนผู้ใช้ ส่งเสริมให้ผู้ใช้พัฒนาตนเอง ส่งเสริมให้เกิดการแข่งขัน
% \item เว็บไซต์มีโจทย์ปัญหาที่หลากหลาย จัดเป็นหมวดหมู่เรียบร้อย จัดระดับความยากง่าย ผู้ใช้สามารถหาโจทย์ปัญหาที่ต้องการทำได้ง่าย
% \item มีระบบสื่อสาร มีระบบกระทู้สนทนา มีช่องทางการสื่อสารให้ผู้ใช้ได้คุยปรึกษากันเรื่องโจทย์ มีช่องทางประกาศประชาสัมพันธ์ข่าวสารและผลการแข่งขัน
% \end{enumerate}
% \item \textbf{ข้อเสีย}
% \begin{enumerate}
% \item เว็บไซต์ไม่สามารถจะใช้งานเครือข่ายเฉพาะได้ เว็บไซต์อยู่ในเครือข่ายสาธารณะ เว็บไซต์นี้ไม่สามารถนำมาใช้ในการแข่งขันที่มีการจำกัดการเข้าถึงข้อมูลออนไลน์
% \item ส่วนประสานผู้ใช้ (User Interface) ออกแบบมาไม่ดี ไม่สะดวกต่อการใช้งาน
% \end{enumerate}
% \end{itemize}
\pagebreak
% TODO: Add LeetCode and other program graders
% \subsection{LeetCode}
% \pagebreak
\subsection{Programming Grader System}
\thaijustify{
ซอฟต์แวร์ PGS หรือชื่อเต็มของโครงการ การพัฒนาระบบตรวจสอบผลลัพธ์ของโจทย์ปัญหาจากชัดซอร์สโค้ดเพื่อการเรียนการสอน (ภาษาอังกฤษคือ Programming Grader System) เป็นโครงงานพัฒนาซอฟต์แวร์ของนักศึกษาชั้นปีสี่ในรายวิชา CPE401 ปีการศึกษา 2563~\cite{nattawat20pgs}
}
\thaijustify{
โดยซอฟต์แวร์ดังกล่าวถูกตั้งขึ้นมาเพื่อแก้ปัญหาการตรวจงานที่ยุ่งยาก ในรายวิชาการเรียนการสอนเขียนโปรแกรมภาษาคอมพิวเตอร์ ซึ่งเป็นปัญหาเดียวกันกับปัญหาที่คณะผู้จัดทำมุ่งมั่นได้ตั้งไว้ และมุ่งมั่นจะแก้ในโครงการนี้ โดยเว็บไซต์นี้ถูกสร้างและออกแบบ โดยนำเอาข้อดีและข้อเสียของเว็บไซต์ IPST Program Grader และ Codeforces โดยนักศึกษาปีสี่กลุ่มดังกล่าวได้ สำรวจและวิเคราะห์ระบบการทำงานและคุณลักษณะ (Feature) ของทั้งสองเว็บแล้วคัดสรรนำคุณลักษณะที่เด่นและดีมาใช้พัฒนาลงในซอฟต์แวร์ PGS
}
\begin{figure}[H]
\centering
\includegraphics[width=9cm]{figure/literature/pgs.png}
\caption[หน้าหลักของ Program Grading System]{หน้าหลักของ Program Grading System หรือ PGS ณ วันที่ 9 ตุลาคม 2566}\label{fig:pgs-page}
\end{figure}
\thaijustify{
เนื่องจากโครงงานปริญญานิพนธ์~\cite{nattawat20pgs} มีปัญหาและเค้าโครงของโครงการที่ใกล้เคียงกับโครงการของคณะผู้จัดทำมากที่สุด เป็นเหตุให้คณะผู้จัดทำตัดสินใจนำเอาโครงการนี้มาเป็นซอฟต์แวร์ต้นแบบ ที่ซอฟต์แวร์กลุ่มคณะผู้จัดทำจะใช้เป็นแหล่งอ้างอิงหลัก
}
\thaijustify{
หลังจากทางคณะผู้จัดทำได้ไปทำการสำรวจและวิเคราะห์คุณลักษณะของซอฟต์แวร์ ทางคณะผู้จัดทำสามารถที่จะสรุปข้อดีและข้อเสียของระบบ PGS ได้ตามตาราง~\ref{tbl:pgs-pro-cons-1} ดังต่อไปนี้
}
\begin{longtable}{p{1cm}|p{6cm}|p{6cm}}
% First header
\caption{ข้อดีและข้อเสียของระบบ Program Grader System}\label{tbl:pgs-pro-cons-1} \\ % First caption
\hline\hline
ข้อที่ & ข้อดี & ข้อเสีย \\
\hline\hline
\endfirsthead
% Re-occurring header
\caption[]{ข้อดีและข้อเสียของระบบ Program Grader System (ต่อ)} \\ % Cont. caption
\hline\hline
ข้อที่ & ข้อดี & ข้อเสีย \\
\hline\hline
\endhead
% First footer
\endfoot
% Last footer
\hline
\endlastfoot
% Body
1. & \RaggedRight{เว็บไซต์มีระบบการตรวจและประเมินผลโปรแกรมที่เร็วพอสมควร}\par & \RaggedRight{การประเมินผลโปรแกรมของเว็บไซต์ไม่มีความคงที่ ตรวจให้ผลทันทีบ้าง ให้ผลช้าบ้าง}\par \\ \hline
2. & \RaggedRight{มีระบบตารางคะแนน มีการจัดอันดับคะแนนผู้ใช้ ส่งเสริมให้ผู้ใช้พัฒนาตนเอง ส่งเสริมให้เกิดการแข่งขัน}\par & \RaggedRight{คะแนนที่ได้บันทึกไว้บนตารางคะแนน ไม่สามารถจะนำออกมาเป็นไฟล์ excel สำหรับตรวจและประเมินได้}\par \\ \hline
3. & \RaggedRight{เว็บไซต์มีโจทย์ปัญหาที่หลากหลาย จัดเป็นหมวดหมู่ตามห้องเรียนเรียบร้อย จัดระดับความยากง่าย ผู้ใช้สามารถหาโจทย์ปัญหาที่ต้องการทำได้ง่าย}\par & \RaggedRight{เว็บไซต์ไม่มีระบบสมัครสมาชิก สร้างบัญชีเอง ฉะนั้นจะต้องให้เจ้าของระบบเป็นคนสร้างบัญชีให้ทุกๆ ครั้ง}\par \\ \hline
4. & \RaggedRight{มีระบบการแสดงความเห็นในแต่ละชุดคำสั่งที่ผู้ใช้ได้ส่งขึ้นมา ที่อาจารย์ผู้สอนหรือผู้ดูแลสามารถมาให้ความเห็นหรือความแนะนำได้}\par & \RaggedRight{การเพิ่มหรือแก้ไขโจทย์นั้นยากลำบากและไม่สะดวก ไม่สามารถจะนำชุดโจทย์ ชุดเทสเคสมาเพิ่มพร้อมกันได้ ต้องทำการเพิ่มทีละรายการ}\par \\ \hline
5. & \RaggedRight{ผู้ใช้ที่สามารถเพิ่มโจทย์ปัญหาเองได้ หากได้รับอนุญาตจากผู้ดูแลเว็บไซต์}\par & \RaggedRight{ในการตรวจชุดคำสั่ง ต้องคัดลอก (copy) จากบนเว็บไซต์มาวาง (paste) บน IDE บนเครื่อง ไม่สามารถที่จะนำชุดคำสั่งออกจากเว็บไซต์เป็นไฟล์ (export file) ออกมาตรวจได้}\par \\ \hline
6. & \RaggedRight{}\par & \RaggedRight{ส่วนประสานงานผู้ใช้ ไม่เป็นมิตรและไม่สะดวกต่อผู้ใช้งาน}\par \\ \hline
\end{longtable}
% IMPROVED TO TABLE
% \begin{itemize}
% \item \textbf{ข้อดี}
% \begin{enumerate}
% \item เว็บไซต์มีระบบการตรวจและประเมินผลโปรแกรมที่เร็วพอสมควร ผู้ใช้สามารถรับรู้ผลได้หลังจากส่งชุดคำสั่งขึ้นตรวจ
% \item มีระบบตารางคะแนน มีการจัดอันดับคะแนนผู้ใช้ ส่งเสริมให้ผู้ใช้พัฒนาตนเอง ส่งเสริมให้เกิดการแข่งขัน
% \item เว็บไซต์มีโจทย์ปัญหาที่หลากหลาย จัดเป็นหมวดหมู่ตามห้องเรียนเรียบร้อย จัดระดับความยากง่าย ผู้ใช้สามารถหาโจทย์ปัญหาที่ต้องการทำได้ง่าย
% \item มีระบบการแสดงความเห็นในแต่ละชุดคำสั่งที่ผู้ใช้ได้ส่งขึ้นมา ที่อาจารย์ผู้สอนหรือผู้ดูแลสามารถมาให้ความเห็นหรือความแนะนำได้
% \item ผู้ใช้ที่สามารถเพิ่มโจทย์ปัญหาเองได้ หากได้รับอนุญาตจากผู้ดูแลเว็บไซต์
% \end{enumerate}
% \item \textbf{ข้อเสีย}
% \begin{enumerate}
% \item เว็บไซต์ไม่สามารถรองรับการทำงานของผู้ใช้หลาย ๆ คน พร้อมกันได้
% \item ส่วนประสานงานผู้ใช้ (หรือ User Interface) ไม่เป็นมิตร ไม่สะดวกต่อผู้ใช้
% \item การเพิ่มหรือแก้ไขโจทย์นั้นยากลำบากและไม่สะดวก ไม่สามารถจะนำชุดโจทย์ ชุดเทสเคสมาเพิ่มพร้อมกันได้ ต้องทำการเพิ่มทีละรายการ
% \item ในการตรวจชุดคำสั่ง ต้องคัดลอก (copy) จากบนเว็บไซต์มาวาง (paste) บน IDE บนเครื่อง ไม่สามารถที่จะนำชุดคำสั่งออกจากเว็บไซต์เป็นไฟล์ (export file) ออกมาตรวจได้
% \item คะแนนที่ได้บันทึกไว้บนตารางคะแนน ไม่สามารถจะนำออกมาเป็นไฟล์ excel สำหรับตรวจและประเมินได้
% \end{enumerate}
% \end{itemize}
\section{ภาษาคอมพิวเตอร์เเละเทคโนโลยี}
\thaijustify{
หลังจากที่ได้ค้นคว้าหาแนวคิด ทฤษฎีและหลักการ รวมไปถึงซอฟต์แวร์ที่จะนำมาใช้อ้างอิงเป็นต้นแบบให้กับซอฟต์แวร์ที่ทางกลุ่มจะพัฒนาขึ้นมาเป็นที่เรียบร้อยแล้ว ในส่วนหัวข้อถัดไปคณะผู้จัดทำจะบรรยายและอธิบายถึงลักษณะ ความสามารถและหน้าทีของเครื่องมือ เทคโนโลยีและซอฟต์แวร์ประกอบแต่ละอย่าง พร้อมทั้งอธิบายถึงเหตุผลที่เครื่องมือ เทคโนโลยีและซอฟต์แวร์ดังกล่าวนั้นเหมาะสมที่จะนำมาใช้ในขั้นพัฒนาซอฟต์แวร์โครงการ
}
\subsection{ภาษาคอมพิวเตอร์}
\thaijustify{
เนื่องด้วยโครงการนี้เป็นโครงการพัฒนาซอฟต์แวร์ จึงต้องมีการเขียนโปรแกรมขึ้นมาเพื่อสร้างเป็นระบบซอฟต์แวร์ คณะผู้จัดทำจึงได้ไปศึกษาหาภาษาคอมพิวเตอร์ที่คิดว่าเหมาะสมกับ จุดประสงค์และการทำงานที่คาดหวังไว้ของซอฟต์แวร์โครงการ
}
\subsubsection{ภาษา Go}
\thaijustify{
ภาษา Go หรือที่รู้จักกันอย่างแพร่หลายว่า Golang เป็นภาษาโปรแกรมเปิดต้นทางที่พัฒนาโดยทีมนักพัฒนาซอฟต์แวร์ที่ Google โดยรวมถึง Robert Griesemer, Rob Pike, และ Ken Thompson เหล่านักพัฒนาที่ในไม่กี่ทศวรรษก่อน พัฒนาภาษา C ขึ้นมา ภาษา Go นั้นถูกออกแบบขึ้น เพื่อแก้ไขข้อจำกัดของภาษาโปรแกรมเดิมที่มีอยู่แล้วทั้งในด้านประสิทธิภาพ (Efficiency) ความเรียบง่าย (Simplicity) และการสนับสนุนการทำงานพร้อมกัน (Concurrency มีไวยากรณ์ (Syntax) ที่กระชับ การกำหนดประเภท (Type) ที่แข็งแรง พร้อมทั้งระบบจัดการทรัพยากรขยะของโปรแกรม (Garbage Collection) ที่มีประสิทธิภาพ~\cite{pike12go, donovan15go}
}
\thaijustify{
จากความเห็นของ \textit{Pike R.} ใน~\cite{pike12go, pike12godev} หนึ่งในลักษณะที่ดีเด่น Go คือการให้ความสำคัญกับความเรียบง่ายและความอ่านง่าย ทำให้เป็นทางเลือกที่ยอดเยี่ยมสำหรับทั้งผู้เริ่มต้นและนักพัฒนาที่มีประสบการณ์มาก มันนำเสนอแนวทางที่มีความเรียบง่าย ป้องกันความซับซ้อนที่ไม่จำเป็น และมีไวยากรณ์ที่ถูกต้องและโดดเด่น ภาษานี้รวมถึงคุณสมบัติที่สนับสนุนการทำงานพร้อมกันที่ซึ่งช่วยให้นักพัฒนาสามารถเขียนแอปพลิเคชันที่มีประสิทธิภาพและมีขนาดใหญ่ได้
}
\thaijustify{
การทำงานพร้อมกันหรือ Concurrency ก็เป็นแข็งสำคัญของ Go อย่างหนึ่ง การทำ Concurrency ในภาษา ทำผ่าน Channel และ GoRoutines ซึ่งเป็น Thread ที่ Light-weighted ทำให้สามารถสร้างโปรแกรมที่ทำงานพร้อมกันได้โดยไม่มีความซับซ้อน~\cite{donovan15go}
}
\thaijustify{
เนื่องจาก ภาษา Go นั้นกำลังได้รับความนิยมในหลาย ๆ ด้าน ณ ปีการศึกษานี้เช่น การสร้างหรือพัฒนาเว็บไซต์ เว็บแอปพลิเคชัน, การสร้างระบบบริการ Cloud, การสร้างซอฟต์แวร์ระบบที่มีประสิทธิภาพ เป็นต้น ภาษา Go เป็นภาษาที่ใช้งานง่าน และสามารถรันโปรแกรมที่อาศัยการทำงานหรือประมวลแบบ Parallel และ Concurrent~\cite{golangorg} ด้วยเหตุนี้บริษัทใหญ่หลายบริษัทในยุคใหม่ที่มีระบบซอฟต์แวร์ที่ใหญ่ จึงนิยมใช้ภาษาดังกล่าว แล้วเนื่องด้วยสมาชิกในกลุ่มคณะผู้จัดทำได้มีโอกาสไปฝึกงานบริษัทที่ใช้ภาษาดังกล่าว จึงเห็นเป็นโอกาสนำความรู้และความเข้าใจมาประยุกต์ในโครงงานนี้
}
\subsubsection{ภาษา JavaScript}
\thaijustify{
ภาษา JavaScript เป็นภาษาโปรแกรมที่หลากหลายและใช้กันอย่างแพร่หลาย โดยหลักแล้วเป็นที่รู้จักจากบทบาทในการพัฒนาเว็บ พัฒนาโดย Netscape และได้กลายเป็นองค์ประกอบพื้นฐานสำหรับการสร้างเว็บไซต์เชิงโต้ตอบและไดนามิก JavaScript ถูกดำเนินการบนฝั่งไคลเอ็นต์ ทำให้เบราว์เซอร์สามารถจัดการ Document object model (หรือเรียกโดยชื่อย่อว่า DOM) และตอบสนองต่อการโต้ตอบของผู้ใช้ ไวยากรณ์ของมันได้รับอิทธิพลจาก Java ทำให้นักพัฒนาที่คุ้นเคยกับภาษา C สามารถเข้าถึงได้~\cite{flanagan20js}
}
\thaijustify{
ข้อดีอย่างหนึ่งที่โดดเด่นของ JavaScript คือการแพร่หลายไปทั่วเว็บเบราว์เซอร์ เนื่องจากได้รับการสนับสนุนโดยเบราว์เซอร์หลักๆ ทั้งหมด เช่น Chrome, Firefox และ Safari การนำไปใช้อย่างแพร่หลายนี้ทำให้มั่นใจได้ว่าแอปพลิเคชันที่ขับเคลื่อนด้วย JavaScript สามารถเข้าถึงผู้ชมจำนวนมากได้โดยไม่มีปัญหาเรื่องความเข้ากันได้~\cite{flanagan20js} นอกจากนี้ JavaScript ยังเปิดใช้งานการเขียนโปรแกรมแบบอะซิงโครนัสผ่านคุณสมบัติเช่นการโทรกลับและคำสัญญา ซึ่งอำนวยความสะดวกในการพัฒนาแอปพลิเคชันเว็บที่ตอบสนองและมีประสิทธิภาพ ลักษณะที่ไม่ซับซ้อนของภาษาช่วยให้โหลดหน้าเว็บได้เร็วขึ้น ปรับปรุงประสบการณ์ผู้ใช้โดยรวม~\cite{crockford08js}
}
\thaijustify{
อย่างไรก็ตาม JavaScript ก็มีข้อเสียอยู่เช่นกัน ข้อเสียเปรียบที่สำคัญประการหนึ่งคือมีโอกาสเกิดช่องโหว่ด้านความปลอดภัย โดยเฉพาะอย่างยิ่งเมื่อดำเนินการบนฝั่งไคลเอ็นต์ เนื่องจากซอร์สโค้ดสามารถมองเห็นได้โดยผู้ใช้ จึงสามารถจัดการเพื่อจุดประสงค์ที่เป็นอันตรายได้ ซึ่งนำไปสู่ความเสี่ยงด้านความปลอดภัย เช่น การโจมตี Cross-Site Scripting (XSS)~\cite{flanagan20js} นอกจากนี้ การขาดการพิมพ์ที่ชัดเจนอาจทำให้การตรวจจับข้อผิดพลาดบางประเภทในระหว่างการพัฒนาเป็นเรื่องยาก ซึ่งอาจนำไปสู่ปัญหารันไทม์ (Runtime) ที่ยากต่อการวินิจฉัยและแก้ไข (Difficult to diagnose and fix)~\cite{crockford08js}
}
\thaijustify{
แม้จะมีข้อจำกัด JavaScript ยังคงเป็นส่วนสำคัญของการพัฒนาเว็บยุคใหม่ เนื่องจากความสามารถรอบด้านและระบบนิเวศที่กว้างขวางของไลบรารี (Library) และเฟรมเวิร์ก (Framework) เช่น React และ Angular ที่สร้างขึ้นจากมัน~\cite{flanagan20js} การพัฒนาอย่างต่อเนื่องของภาษาและความพยายามในการแก้ไขข้อบกพร่องมีส่วนช่วยให้ภาษามีความเกี่ยวข้องอย่างต่อเนื่องในภูมิทัศน์แบบไดนามิกของการพัฒนาเว็บ~\cite{crockford08js}
}
\thaijustify{
แม้ภาษา JavaScript จะเป็นภาษาที่นิยมสำหรับการเขียนส่วนประสานงานผู้ใช้ แต่ทางคณะผู้จัดทำตัดสินใจไม่เลือกที่จะใช้ภาษา JavaScript เพราะข้อผิดพลาดและข้อเสียของภาษาหลายอย่าง ไม่สามารถที่จะมองข้ามไปได้และสามารถที่จะสร้างเป็นอุปสรรคสำหรับงานโครงงานของกลุ่ม อาทิเช่นการนิยามประเภทของตัวแปร ของ JavaScript (Type-defining) ที่กำกวมและไม่เป็นระเบียบ อาจทำให้การตรวจสอบหาข้อผิดพลาดของการทำงานตรงส่วนประสานงานผู้ใช้ที่เขียนด้วยภาษาดังกล่าว ตรวจสอบหาปัญหาได้ยาก
}