• Log InLog In
  • Register
Liquid`
Team Liquid Liquipedia
EDT 10:37
CEST 16:37
KST 23:37
  • Home
  • Forum
  • Calendar
  • Streams
  • Liquipedia
  • Features
  • Store
  • EPT
  • TL+
  • StarCraft 2
  • Brood War
  • Smash
  • Heroes
  • Counter-Strike
  • Overwatch
  • Liquibet
  • Fantasy StarCraft
  • TLPD
  • StarCraft 2
  • Brood War
  • Blogs
Forum Sidebar
Events/Features
News
Featured News
[ASL22] Ro24 Preview: Siren's Call8[ASL22] Ro24 Preview: Summer's End9Serral wins HomeStory Cup 2915Serral wins Maestros of the Game 244ByuL, and the Limitations of Standard Play3
Community News
New 3v3 BGH Ladder (and more) on ShieldBattery!33Weekly Cups (August 17-23): Zerg dominate the week6Weekly Cups (August 10-16): SHIN doubles2GSTL Returns in 2026!45Weekly Cups (Aug 3-9): Protoss get shut out7
StarCraft 2
General
How would you feel about frequent/monthly balance patches for SC2? SC4ALL II: SC2 Player Announcement 6/8 - Maru Weekly Cups (August 17-23): Zerg dominate the week Daily SC2 Player Grid - feedback wanted Balance hotfix patch 5.0.16b (July 16)
Tourneys
Sparkling Tuna Cup - Weekly Open Tournament 2026 GSTL Announcement IntoTheTV X SOOP SC2 League : Weekly & Monthly PIG STY FESTIVAL 8.0! (13 - 23 August) WORTEX 2026 - Hungarian SC2 Finals Budapest
Strategy
[G] Having the right mentality to improve
Custom Maps
Nexus Wars 2021 GUIDE [M] (2) Industrial Park
External Content
The PondCast: SC2 News & Results Mutation # 540 Dodge This Mutation # 539 Thunder Dome Mutation # 538 Media Blackout
Brood War
General
BW General Discussion ASL22 General Discussion [Personal Project Share] Terran Defense v0.60 BGH Auto Balance -> http://bghmmr.eu/ New 3v3 BGH Ladder (and more) on ShieldBattery!
Tourneys
[Megathread] Daily Proleagues [ASL22] Ro24 Group F BSL LAN Party - Kraków 29-30 August - OPEN SIGNUPS Escore Tournament - Season 3
Strategy
Replay Review Process - What do you do? Game Theory for Starcraft Odyssey Mineral Stack Saturation Fighting Spirit mining rates
Other Games
General Games
Nintendo Switch Thread Stormgate/Frost Giant Megathread General RTS Discussion Thread Anyone here play Quakeworld back in the day? EVE Corporation
Dota 2
Official 'what is Dota anymore' discussion
League of Legends
[TL LoL EUW IHs] Teemo shall perish TSM pausing esports and CLG Dead
Heroes of the Storm
Heroes of the Storm 2.0
Hearthstone
Deck construction bug
TL Mafia
TL Mafia Power Rank TL Mafia Community Thread NeO.D_StephenKing vs This Guy From 1 Million Dance
Community
General
US Politics Mega-thread Things Aren’t Peaceful in Palestine Russo-Ukrainian War Thread European Politico-economics QA Mega-thread The Letting Off Steam Thread
Fan Clubs
MarineLorD Fan Club The Creator Fan Club The ShoWTimE Fan Club
Media & Entertainment
Movie Discussion! Anime Discussion Thread
Sports
Football (Soccer) Thread TeamLiquid Health and Fitness Initiative For 2023 MLB/Baseball 2023 NBA General Discussion
World Cup 2022
Tech Support
Computer Build, Upgrade & Buying Resource Thread
TL Community
The Automated Ban List Northern Ireland Global Starcraft
Blogs
Regacy Esports: The Bh…
regacyesports
Violent Games and Crime Rate…
TrAiDoS
LOCKPICKING NOOB
LUCKY_NOOB
Cathedral Of CS And NY pizza a…
FuDDx
Please support my new stand…
Peanutsc
Customize Sidebar...

Website Feedback

Closed Threads



Active: 7892 users

A programming lesson I won't forget

Blogs > Barbiero
Post a Reply
Barbiero
Profile Blog Joined September 2010
Brazil5259 Posts
July 09 2014 05:52 GMT
#1
So, I'm a CS student. My parents own a radio company(they are lit. Motorola resellers) and they have their share of needs in the world of computing, but they never actually asked me to do something until now. That's because only now have I been actually learning how to develop stuff properly.

Queue the request. It's a fairly simple system to create deadlines for certain jobs in the company, and show who is delaying or not. It's kinda cool.

The issues are, of course, the details. The request was simple: "we want to provide a time window in hours for a job, and the program has to give a date as the deadline". Simple right? Except that the deadline has to account for work days and hours.

Since I have little experience with the various programming languages, my language of choice is Java. Reason being that I'm more used to it and because I know it's very easy to find well documented libraries for almost everything in Java. And alas, there is joda-time as a sweeet date/time language. Love it.

However, It obviously does not include the concept of work days/hours. So how the f* do I implement that?


Man, have I learned a lot of lessons today. First I tried to implement a new class called WorkDateTime to simulate LocalDateTime. Too complicated and most of the functions were duplicates. Scratched.

I ended up making a function that converts a LocalDateTime to the next work hour compatible: so something at 12:20 would be converted to 13:30 on the same day, and Friday 19:00 would become Monday 08:00 of the next week. Joda-time is really good at that.

But the issue was with addition. Since I had a number of hours to serve as a base for my deadline, I needed to find a way to add these hours into a base time(the time of assignment for the job) and not count the non-working hours. Do I add and then count backwards? Do I try to predict it? Fuck this isn't trivial at all.

While trying to think of the solution, one came to mind that made me chuckle: add the hours one by one. For each addition, verify if the time "overflowed" past work hours. If so, convert the time to the next work hour and add the overflow. Finish the loop when there are neither hours nor overflow to add anymore.

I chuckled because that's one hell of an inefficient algorithm. It runs on more-than-linear time compared to the size of the deadline. I thought "that's stupid!" and went back to trying to figure out an efficient algorithm.

I spent literally 8 hours doing that(with a break to watch Liquid win and Brazil get destroyed by Germany). I still haven't figured out how would I implement the algorithm to consider the work hours when adding the new hour.

What did I do? I implemented the "inefficient" one. Not because I gave up, but because it wasn't worth to go to the next day thinking about it when the "inefficiency" isn't THAT costly: the calculation is done once per part of job(so about 150 times a day tops) and most of the deadlines are 2 to 5 hours, maybe one or another with a 20 hour deadline. When you translate this to computer processing, it's a ridiculously small value. The time I waste trying to figure out the efficient one will never be worth the smudge of efficiency I would harvest.

So I literally brute forced my way through this one. Lesson learned: just because it may not be the most efficient, if the efficiency is negligible the development cost isn't worth it.


On a side note, the IntelliJ Idea is awesome. Now to figure out how to work with databases... *shrug*
♥ The world needs more hearts! ♥
icystorage
Profile Blog Joined November 2008
Jollibee19350 Posts
July 09 2014 06:03 GMT
#2
5 star for a programming blog.
LiquidDota StaffAre you ready for a Miracle-? We are! The International 2017 Champions!
SilverSkyLark
Profile Blog Joined April 2008
Philippines8437 Posts
July 09 2014 09:09 GMT
#3
What IDE are you using?
"If i lost an arm, I would play w3." -IntoTheWow || "Member of Hyuk Hyuk Hyuk cafe. He's the next Jaedong, baby!"
LightTemplar
Profile Blog Joined August 2011
Ireland481 Posts
July 09 2014 09:12 GMT
#4
To quote Knuth:
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil"

Before you ever try to come up with a better algorithm to solve the problem you are facing its a really good idea to do some back of the envelope calculations and figure out how much your inefficiency is actually going to cost in real world terms. Its probably a little late to point that out now but hey you learned the lesson. Best of luck continuing with your development!
"Thoughts are always there, the mind can't stop" - Grubby
Noyect
Profile Blog Joined July 2010
Sweden129 Posts
July 09 2014 12:26 GMT
#5
Cool to see a programming blog
Been practicing on and off myself aswell and the algorithms really are the challenging part :D
This question is more intended as quick brainstorming from a student looking to learn rather
than advice from someone knowledgeable :D

Instead of adding the hours one by one and checking to see if they overflow to the next day, could you
not "re-label" the hours so that hours 1-9 are monday, 10-18 are tuesday and so on?
If a job takes 22 hours you'ld know that it falls into the scope of wednesday.
Stegosaurus
Profile Joined March 2011
United States52 Posts
Last Edited: 2014-07-09 14:59:12
July 09 2014 14:58 GMT
#6
On July 09 2014 18:09 SilverSkyLark wrote:
What IDE are you using?



Since he mentions IntelliJ IDEA, I would guess that.

Good on you for jumping on IDEA, it's an incredible IDE.
If you're writing in Java, and trying to use databases, you should definitely consider using Hibernate. It's pretty awesome.
*insert witty comment here*
Barbiero
Profile Blog Joined September 2010
Brazil5259 Posts
July 09 2014 15:42 GMT
#7
On July 09 2014 21:26 Noyect wrote:
Cool to see a programming blog
Been practicing on and off myself aswell and the algorithms really are the challenging part :D
This question is more intended as quick brainstorming from a student looking to learn rather
than advice from someone knowledgeable :D

Instead of adding the hours one by one and checking to see if they overflow to the next day, could you
not "re-label" the hours so that hours 1-9 are monday, 10-18 are tuesday and so on?
If a job takes 22 hours you'ld know that it falls into the scope of wednesday.

This falls off when dealing with holidays, company breaks etc. Basically, later I'll need to have a holiday database as well.

Also yeah I'm using intellij idea
♥ The world needs more hearts! ♥
obesechicken13
Profile Blog Joined July 2008
United States10467 Posts
Last Edited: 2014-07-09 23:12:40
July 09 2014 23:11 GMT
#8
On July 09 2014 18:12 LightTemplar wrote:
To quote Knuth:
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil"

Before you ever try to come up with a better algorithm to solve the problem you are facing its a really good idea to do some back of the envelope calculations and figure out how much your inefficiency is actually going to cost in real world terms. Its probably a little late to point that out now but hey you learned the lesson. Best of luck continuing with your development!

To be honest, it's really hard to know just how efficient your code has to be, because you don't know if you're slowing database queries or writing inefficient code that occasionally results in crashes/spikes to your services.

I think if you don't know how efficient your code needs to be it can be worthwhile to take the time to think of a way to optimize it slightly.

(I just need to really have a massive failure before I agree with Knuth).
I think in our modern age technology has evolved to become more addictive. The things that don't give us pleasure aren't used as much. Work was never meant to be fun, but doing it makes us happier in the long run.
CatNzHat
Profile Blog Joined February 2011
United States1599 Posts
July 10 2014 04:55 GMT
#9
How would you go about figuring out 23 work hours from now, starting at 2pm today, as a human, with pen and paper.

This is how you should start when you develop an algorithm.

I would start with breaking it into 2 separate pieces, how many days from now, and how many hours into that day.

23 hours is 2 days (8 hrs each) and 7 hours (23 - (2*8) = 7)
Simply advance current time by 2 days and 7 hours.
But wait, what if it's 12:00pm right now, that would mean I've already worked 3 hours today, so if I go 7 hours forward I'll end up with 10 hours. Delegate back to the same logic, 10 hours is 1 day and 2 hours. Advance a day, start 2 hours in.


We can see a pattern starting to form here, you have a concept of hours in a work day, and you have a concept of how that maps to hours in a day. The same pattern holds for days of work in a week.

If it's the 5th work day in the week and the last hour in that day, adding two hours will have to advance the day, which will advance the week.

The class could be laid out with a configuration something like this:
hours_in_workday: 8
start_of_week: monday
start_of_weekend: saturday
length_of_weekend: 2 days
start_of_day: 9:00am
start_of_lunch: 12:00pm
lunch_duration: 1:00hr

With this information you can construct a pretty simple time keeping system, and configure it as needed. Insert national holidays, etc.. etc..

While this solution is definitely more efficient than yours, I never once considered performance. All I was thinking of was the simplest solution that was easy to understand. I start with how I would solve the problem by hand with pen and paper. It's rather straight forward and kind of trivial when you really think about it. The only 'logic' is a switch to simply say 'is this number of hours larger than the work day' and 'is this number of days larger than the work week'.

Code clarity and simplicity is what allows you to build and maintain complex code bases.

There is a unique skillset for figuring out how you're really solving a problem, I mean if I told you to figure out what time you'd be done with something next week if you start on a wednesday afternoon at 2pm if it were to take you exactly 34 hours and you worked exactly 40 hours a week.

You'd be able to figure it out, and you wouldn't iterate through each hour to do it. You might even optimize your solution without even realizing it, subtracting the number of hours left in the current week since you know it will be some time next week, and then subtracting from that in 8 hour chunks to determine how many days into the next week it would be, and then subtracting 4 to determine how many hours after your lunch break it will be.

Converting that to code is a separate matter, and can be done many different ways, and that is where the real performance issues can be benchmarked and addressed.
rebdomine
Profile Blog Joined October 2010
6040 Posts
July 11 2014 09:22 GMT
#10
On July 09 2014 23:58 Stegosaurus wrote:
Show nested quote +
On July 09 2014 18:09 SilverSkyLark wrote:
What IDE are you using?



Since he mentions IntelliJ IDEA, I would guess that.

Good on you for jumping on IDEA, it's an incredible IDE.
If you're writing in Java, and trying to use databases, you should definitely consider using Hibernate. It's pretty awesome.


I think it is worthwhile to learn the basics of SQL though before jumping straight into Hibernate. I see a lot of people struggling with native SQL cause they've been too used to Hibernate.
"Just because you are correct doesn't mean you are right!"
Count9
Profile Blog Joined May 2009
China10928 Posts
July 13 2014 01:38 GMT
#11
Thought this was gonna be about the scheduling problem and algorithms from the beginning. Also, pretty sure your solution is linear time :p
SpeaKEaSY
Profile Blog Joined December 2010
United States1070 Posts
July 14 2014 11:49 GMT
#12
haha I'd do this sort of thing on math tests where they had you add large numbers in series, I'd just write a quick program for the TI-83+ to brute force the problem rather than solve it analytically
Aim for perfection, settle for mediocrity - KawaiiRice 2014
ZeaL.
Profile Blog Joined April 2009
United States5955 Posts
Last Edited: 2014-07-18 20:32:27
July 18 2014 20:32 GMT
#13
oops
Please log in or register to reply.
Live Events Refresh
WardiTV Weekly
11:00
#102
IntoTheiNu 1575
WardiTV1087
TKL 300
IndyStarCraft 263
Rex166
Liquipedia
[ Submit Event ]
Live Streams
Refresh
StarCraft 2
TKL 300
IndyStarCraft 263
Rex 166
Trap 14
StarCraft: Brood War
Britney 52277
Calm 7207
Shuttle 4978
EffOrt 1057
BeSt 978
Horang2 817
Mini 546
actioN 403
Light 389
firebathero 326
[ Show more ]
Soulkey 233
Stork 231
ZerO 219
ZZZero.O 201
Rush 185
ggaemo 157
Last 90
Killer 80
Snow 78
Sea.KH 74
hero 74
Hyun 72
Mind 72
Hm[arnc] 47
Liquid`Ret 47
PianO 45
sSak 43
JYJ 42
Shine 32
scan(afreeca) 28
ToSsGirL 26
Aegong 23
ZergMaN 19
sorry 19
Sexy 18
Terrorterran 16
zelot 15
Rock 14
SilentControl 11
ajuk12(nOOB) 9
Dota 2
qojqva3275
420jenkins451
LuMiX1
Counter-Strike
fl0m2874
nookyyy 70
Super Smash Bros
Mew2King158
Heroes of the Storm
Liquid`Hasu401
Khaldor297
Other Games
singsing2133
B2W.Neo732
crisheroes562
Beastyqt474
XaKoH 192
Hui .170
ZerO(Twitch)19
Organizations
Other Games
gamesdonequick4760
EGCTV634
StarCraft: Brood War
Kim Chul Min (afreeca) 8
[ Show 13 non-featured ]
StarCraft 2
• Berry_CruncH341
• AfreecaTV YouTube
• intothetv
• Kozan
• IndyKCrew
• Migwel
StarCraft: Brood War
• BSLYoutube
• STPLYoutube
• ZZZeroYoutube
Dota 2
• lizZardDota267
League of Legends
• Jankos1917
• Nemesis1441
Other Games
• WagamamaTV476
Upcoming Events
PSISTORM Gaming Misc
1h 28m
Sparkling Tuna Cup
19h 23m
Afreeca Starleague
19h 23m
Monday Night Weeklies
1d 1h
GSL
1d 20h
PiGosaur Cup
2 days
Replay Cast
3 days
The PondCast
3 days
IntoTheTV X SOOP
4 days
CranKy Ducklings
5 days
[ Show More ]
Sparkling Tuna Cup
6 days
OSC
6 days
Liquipedia Results

Completed

Proleague 2026-08-27
PiG Sty Festival 8.0
Light Tournament 2026

Ongoing

KCM Race Survival 2026 Season 3
K-JUNGMAN
ASL Season 22
Super Anchor Qualifying S3
CSL Season 22: Qualifier 2
BSL 2026 LAN: Kraków
RSL Revival: Season 6
Big Dog Cup 2026 Div 1
BLAST Open Fall 2026
Esports World Cup 2026
Esports World Cup 2026: LCQ
BLAST Bounty Summer 2026
BLAST Bounty Summer Qual
Stake Ranked Episode 3
XSE Pro League 2026
IEM Cologne Major 2026

Upcoming

CSL 2026 AUTUMN (S22)
Escore Tournament S3: King of Kings
Acropolis #5
Acropolis #5 - TRS
Blizzard Classic Cup 2026
Acropolis #5 - GSA
Acropolis #5 - GSB
HSC XXX
SC4ALL II: StarCraft II
Kung Fu Cup 2026 Grand Finals
RSL Offline Finals
Calamity Invitational
BLAST Rivals Fall 2026
IEM Beijing 2026
Stake Ranked Episode 5
PGL Masters Bucharest 2026
1win Private Club #2
Thunderpick World Champ. '26
ESL Pro League Season 24
Stake Ranked Episode 4
1win Private Club #1
Logitech G Play Connect 2026
SL StarSeries Fall 2026
FISSURE Playground #3
TLPD

1. ByuN
2. TY
3. Dark
4. Solar
5. Stats
6. Nerchio
7. sOs
8. soO
9. INnoVation
10. Elazer
1. Rain
2. Flash
3. EffOrt
4. Last
5. Bisu
6. Soulkey
7. Mini
8. Sharp
Sidebar Settings...

Advertising | Privacy Policy | Terms Of Use | Contact Us

Original banner artwork: Jim Warren
The contents of this webpage are copyright © 2026 TLnet. All Rights Reserved.