Identification Scheme

An entity must have a unique identity, so that other objects can uniquely identify it. In an application with one object store, this is not a problem, because the identity usually takes the form of the auto generated identity value assigned to the object when gets persisted. A good example of this is something like a simple web application, that keeps all it’s objects in a single SQL database. When new objects are persisted to the database, the primary key is automatically incremented, and this becomes the identity of the new entity.

However, when an entity is referred to differently by more than one context, the situation becomes slightly more complicated. In this scenario an entity will actually have multiple identities, depending on which object or system is referring to it. The solution to this problem is to use an Identification Scheme, where each identity has a type associated with it:


type PersonIdScheme =
  | Passport
  | National
  | DriversLicense

type PersonIdentifier (scheme, value) =
  member me.scheme = scheme
  member me.value = value

type PersonIdComparer() =
  interface IComparer<PersonIdentifier> with
    member me.Compare(a, b) = if a.scheme = b.scheme && a.value = b.value then 0
                              else -1

type Person (id: Set<PersonIdentifier>) =
  let mutable _id = id

member me.id
  with get () = _id
  and set (value) = _id <- value

The above example demonstrates how you can design an Object Oriented Identification Scheme, in F#, to identify a person. Two things stand out, one is the enumeration PersonIdScheme, that specifies the different ways in which a person can be uniquely identified.

The second is the property Person.id, that’s a Set of PersonIdentifiers. Because an object now has a collection of identities, it’s necessary for the Identification Scheme to enforce a unique identity value per Scheme.

Now, let’s implement a functional Identification Scheme in OCaml. Imagine an application that stores discount sales deals in different databases, either relational, Identity.t.Common, or something like Amazon S3, Identity.t.ObjStore:

common.ml


module rec Identity :
sig
    type t = | Id of IdSet.t
             | Common of string
             | ObjStore of string

val scheme : t list -> IdSet.t
end =
struct
    type t = | Id of IdSet.t
             | Common of string
             | ObjStore of string

let scheme lst =
    List.fold_right (fun item set -> IdSet.add item set) lst IdSet.empty
end
and IdSetItem : Set.OrderedType =
struct
    type t = Identity.t
    let compare = Pervasives.compare
end
and IdSet : (Set.S with type elt = Identity.t) = Set.Make(IdSetItem)

deals.ml


open Core.Std
open Common
open Common.Identity

type deal = {
    id: Identity.t;
    title: string;
    description: string;
    expiry_date: Time.t;
}

deal_repository.ml


open Core.Std
open Common
open Common.Identity
open Deals

let save deal =
    (* In a real app, the deal will be saved here.
       For the example just return the passed in deal. *)
    deal

let get_by_id deal_id =
    (* In a real app, the database will be queried here.
       For the example just return a fake deal. *)
    { id = Id (scheme [Common "1"; ObjStore "2"]);
      title = "?";
      description = "?";
      expiry_date = Time.now ();
    }

The most interesting piece of code from the above example is the Identity.t recursive variant. The Id tag is a Set of recursive Identity.t tags. The function scheme converts a list of Identity.t tags to a Set. The “module rec” statement, declares the modules mutually recursive, so that the Identity.t variant and IdSet Set can refer to each other. The end result is a self explaining statement like “Id (scheme [Common "1"; ObjStore "2"])” to create a new collection of Identity.t values.

 

It’s an interesting comparison between OCaml and F#, and Object Oriented and functional. The F# code looks more succinct, and in the OO code we have to deal with mutable state. For the F# code I chose to use an Enumeration, but I could’ve used a Discriminated Union to make it the same as the Variant in OCaml


Notes On SharePoint Business Connectivity Services

The past 2 weeks I had an opportunity to develop a solution with SharePoint 2010′s Business Connectivity Services. I found working with SharePoint BCS to be a delicate process, with a few things not behaving entirely as expected. Here’s a few quick notes to help clarify some of the things that confused me most about BCS:

1.

For each BCS Entity’s Identifier, its Specific Finder must have an equivalent In Parameter. In other words, for example, if you have 2 Identifiers, then your Specific Finder method must have 2 corresponding input arguments.

2.

All the other methods have a dependency on the Entity’s Specific Finder. If you change the fields, or their Type Descriptors, of Specific Finder’s return parameter object, then you have to update the update and create methods accordingly. The principle is explained in the Implementing an Updater article on MSDN: “If there are multiple specific finders, the Updater view should be equal to, or a subset of, at least one SpecificFinder view.” I know it refers to “multiple specific finders”, but it found it to work the same whether there’s one or more specific finders.

3.

Your permissions are removed from the BCS Service Application (in Central Admin), and you get the “Access denied by Business Data Connectivity.”, when you deploy a new BCS model, after changing the methods, Type Descriptors or any other part of the model. This didn’t always seem like it happened consistently. At times, it seemed like it was removing the permission at random, even when I just updated the code of my entities or services.

4.

Make sure you activate SharePoint Server Enterprise Site Collection features for your Web Application.

5.

Whenever I modified a Creator method, and refreshed the page, I started getting strange errors on the list page, and had to recreate the List to fix it.

 

 


Playing With Gimp

Playing around with Gimp, using some awesome free ultra high quality images from gratisography.com.

Cloudy Shore

Cloudy Shore


Managing Enterprise Integration Portal Projects

Performing large enterprise integration projects, spanning many different teams, and technologies, is a formidable challenge. This remains true, whether you use Scrum, or waterfall – there’s no magic process. Having said this, I’d like to share some things I wished I was more aware of, before embarking on a recent large integration project, for a SharePoint extranet portal.

Map Team Dependencies Using A Tool

Because enterprise integration projects span many teams, you will quickly realize that your standard Scrum board, that always served your solo development team so well, isn’t sufficient anymore.  Combine this with some teams residing at different locations, and you have a situation where not only Scrum’s task board isn’t working that well anymore, but also many of the other Scrum techniques that depend on face-to-face interaction, like stand ups and Scrum of Scrums. What you need is a tool to connect each team’s work to the other teams they depend on, to create an inter team and story and task dependency graph. This way it becomes very easy to understand each team’s contribution to the overall completion and delivery of a work item.

At the start of each sprint the teams without any dependencies on other teams enter their stories and tasks first. When some of their stories have been entered,  other teams that depend on them can start entering their stories in turn, and so it continues until all the teams have mapped out their work. For example Team Foundation Server (TFS)  allows you to setup parent-child relationships between tasks and backlog items. By the way, I see Visual Studio-TFS Online now provides a free basic plan to 5 users. So, no more excuses for not using a proper Application Lifecycle Management Tool (ALM) ;-)

Code Reviews As Acceptance Criteria

A good way to increase the quality and knowledge of the application, is to make peer code reviews part of each story’s acceptance criteria. Doing lots of small code reviews, creates a faster personal feedback loop, compared to large code reviews every couple of days or weeks, involving the whole team. Because the code reviews are being done more frequently, mistakes in the code are identified more often and fixed sooner.

Try to pair developers with different experience, backgrounds and skills (i.e. try to avoid the same people reviewing each others code all the time).

You Need More Environments Than You Think

A system’s environment refers to all the supporting services and hardware, servers, and network infrastructure that an application depends on. For large, complicated integration projects you definitely want to make sure you have enough environments to make sure the application is thoroughly tested beyond the developer’s local workstation. For these projects the environment introduces a significant number of variables that impact on the application’s performance, security and general operation. What makes things more complicated, is that many of these infrastructure elements are not available on the developer’s local workstation.

The following system environments are recommended, to ensure any issues created by a new environment configuration, can be identified and quickly fixed early in the process:

  1. A local development environment where the application gets developed. A good way to standardize this environment is to create a Virtual Machine (VM) that can be copied and used by all the developers. This environment is owned by each individual developer.
  2. A development environment where the application can be tested by the development team. If you have more than one team working on the same code base, then you will actually need a development environment per team-code-branch, so that each team can test their version of the application independently of the other one. This is also the first environment where all the separate teams will integrate their applications and services. This environment is collectively owned by the development teams.
  3. A  Quality Assurance (QA) or acceptance environment where the application can be tested by a dedicated test team. This environment is owned by the dedicated test team.
  4. Obviously production, where application’s customers will use it. This environment is indirectly owned by the application’s customers and the system administrators.
  5. Highly recommended is another environment that mirrors production, so that problems in production can be diagnosed and tested in the same infrastructure configuration as production, without affecting the live environment in the process.

Make sure that all these environments, except the local workstation one, is part of the application life cycle at the client’s premises and inside their infrastructure.

Plan Sprints, Even If It’s Waterfall

Often the overall methodology used will be prescribed, and even if you can change this, it will take a lot of time to change an entire organization’s modus operandi. Usually corporate business prefers waterfall, and developers agile. It’s a lot easier to take control of development type tasks and apply agile practices to them. One such task is estimates. Waterfall estimation usually specifies a single ‘expert’, often outside the development team, to estimate work (this has been proven not to improve the accuracy of estimates). Agile requires the entire team, that will do the actual development, to be involved. Therefore even though business might require a solo expert to do the estimates, the truth is they usually don’t care how you come up with the estimates, as long as they are accurate, and provided in a timely manner.

We found it very valuable doing group estimations using planning poker, even if the final estimate is given in hours or days, instead of story points. There’s an enormous amount of value in the discussion that goes into coming up with an estimate:

  • Results in more accurate estimates because:
    1. The actual people that will do the work gives them, this has a tremendous impact on how long something will take to get done.
    2. A bigger range of numbers is used to produce the final estimate. Statistically making for a sounder figure.
  • Facilitates critical thinking about the existing and design and technical implementation of the product.
  • Improves shared ownership of work, and cooperation between team members.
  • Improves learning about the product’s existing and future stories.
  • Lowers personal barriers to communicate and debate.

It’s a story for another day, and a work in progress, how we convert between story points and hours.

Estimate, Allocate and Manage Testing

Again, one of the things waterfall specifies is that testing is done as a separate activity, and not as part of the development process itself. While it’s definitely a good thing to have a separate QA test team, testing the product before it gets released, not doing this earlier during development is dangerous. It’s highly unlikely in an environment like this, that business will approve a dedicated tester for your team.

Well, it will take some effort to convince the developers, but add a testing activity as a percentage of the development effort to estimates. You now have some hours per sprint that you can use to allocate a developer to, to perform dedicated functional testing of the application during development.

If you don’t religiously guard against it, getting developers to perform functional testing, will lead to test corruption. Test corruption happens when a developer uses time allocated for testing, for other tasks, primarily developing new features and fixing bugs. The best way to manage this, is to allocate the testing activity on a set schedule to a developer, and ensuring she doesn’t do any development work during that time. Consider using a separate test computer without any development tools on it. This will make it physically impossible for the test-developer to do development work, and indicate to the rest of the team that she is performing functional testing, and should not be involved with development work. 

Clarify The Meaning Of “Percentage Complete”

Communicating “how far” you are with a story or task is a standard requirement of any project. But what does it mean when you say you are “50% done”? Take some time to think what your typical development workflow consists of and what essential, but often forgotten tasks, you’d like included in the development of each story. This may consist of things like:

  1. A story’s sub-tasks
  2. Acceptance criteria
  3. Developer and tester functional testing
  4. Deployment

For example, you would probably want to do a peer code review before a story is marked as complete, but after all or certain types of tasks have been done. So maybe a code review being performed is 80% and code review corrections are 85%. Or perhaps, before the coding of each story commences, you require the developer to have a quick design session with the architect and/or one or two of his colleagues, so this will be 10% complete. Maybe you want a developer to deploy the new feature to a separate development environment, and perform his own functional testing, before the story is handed over to the team’s dedicated tester. What percentage complete would these be?

This will help each team member understand what is expected of him to complete a story, and the project manager and other team members know what is meant when he says he is “90% done”.


Get Up and Running With SQL Server Express, Clojure, SQL Korma and Local Jars

Just a sweet and short little post to help others get up to speed accessing SQL Server Express 2008 with Clojure’s SQL Korma library.

Set Up SQL Server Express

I’m using SQL Server 2008 Express. To configure your DB server go to Start > All Programs > Microsoft SQL Server 2008 > Configuration Tools > SQL Server Configuration Manager. Under SQL Server Network Configuration select Protocols for SQLEXPRESS. On the panel on the right size of the screen, make sure TCP/IP is Enabled, then right click it and select Properties. Select the IP Addresses tab, and make sure you have the following settings:

  1. For IP Address 127.0.0.1
    • Active: Yes
    • Enabled: Yes
    • TCP Dynamic Ports: Make sure this entry is empty.
    • TCP Port: Make sure this entry is empty.
  2. For IPAll:
    1. TCP Dynamic Ports: Make sure this entry is empty.
    2. TCP Port: 1433

Enable SQL Server mixed mode authentication (SQL Korma doesn’t do integrated/Windows authentication). Run regedit.exe and go to HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQLServer. Change the LoginMode to 2, and restart the SQL Server Express service.

Okay, so we can now create SQL accounts on SQL Server Express, so let’s enable the SA account with SQLCMD:

  • sqlcmd .\SQLEXPRESS -E
  • ALTER LOGIN sa ENABLE
  • GO
  • ALTER LOGIN sa with password=’aPassword’
  • GO
  • exit

Maybe you don’t want to enable the SA account, but rather create a new non-sysadmin account, as it’s a security risk to use SA for your apps. I just used it here, as it was the shortest way to get a SQL account ;-)

Load The SQL Server JDBC Driver Into a Local Artifactory Repository

Download JFrog’s Artifactory. Go to Artifactory’s bin folder and run InstallService.bat. Then launch Artifactory with  artifactory.bat, and browse to http://localhost:8081/artifactory/webappGrab Microsoft SQL Server JDBC Driver 3.0 and load it into a local Artifactory repository with the following settings:

  • GroupId: sqljdbc4
  • ArtifactId: sqljdbc4
  • Version: 3.0

The reason we’re using Artifactory, is that Leiningen demands that all your dependencies come from a repository somewhere. Since Microsoft’s JDBC driver isn’t available on a public repository like Clojars, is make it available from a local repository. You’re other option is to directly load it into a Maven repository, but trust me, this is time consuming and something you want to avoid.

Now add your local repository to Lein’s defproject, :repositories {“ext-release-local” “http://localhost:8081/artifactory/ext-release-local/&#8221;}. You can see I chose to load sqljdbc4.jar into the ext-release-local repository. Also add the SQL Server JDBC driver as a dependency: [sqljdbc4/sqljdbc4 "3.0"]

Make a Nice Clojure SQL Korma

And finally drop SQL Korma as a dependency into your Leiningen project, and do the rest of its configuration as specified on Git Hub:  [korma "0.3.0-RC4"]. If you’re new to SQL Korma, like I am, you might think that (defentity …) will also create your database objects for you. Not so! SQL Korma doesn’t have this feature currently (version 0.3.0) – hopefully they’ll add it in future. So make sure you’re DB objects exist and that the defentity statements correctly map to them.

Sounds like a few simple steps, but I took me unnecessarily long to piece all the above together, and get to the point of accessing SQL Server Express 2008 with SQL Korma. Hopefully the above will help others to reach SQL Server and Korma Nirvana, one time!

 


One Dragon Descends, The Other Bleeds In The Water

This is the second post in a series about Vietnam. Over the next few posts I will be telling the story of and leading up to how Gia Long came to rule Vietnam, and restore the Nguyễn family to the throne as rulers of the entire Vietnam.

It all started in the year 207 BCE, when the Chinese general Zhao Tuo (Triệu Đà) seized an opportunity to create his own kingdom. Amid the chaos of the crumbling Qin dynasty, he seized sovereign control of his region from the Chinese state of Zhao, to create the Nan Yue (Nam Viet) kingdom. To the south of Nan Yue, Thục Phan, ruled over the ancient kingdom of Au Lac. Thục Phan rose to the throne as king An Duong Vuong when he defeated the last king of Van Lang, and renamed the kingdom Au Lạc. Even before the time of Zhao Tuo, the Qin Chinese empire sent many envoys to conquer Au Lac, but all failed. Until Zhao Tuo marched south …

Co Loa

By Gavin White

After becoming king of Au Lạc, Thục Phan decided to construct a new capital for his land. However construction of its citadel posed to be a hugely complicated affair. When King Thục Phan started construction of the citadel, for a long period, whatever was built during the day was totally demolished at night by some invisible force. An Duong decided to organize a ceremony, during which he asked the Spirits permission to build his new capital. The River Spirit appeared in the form of a golden turtle, Kim Quy, whose advice finally led to the decision not to locate the citadel directly on top of its carapace and to build the fortifications. The long walls followed a spiral, rising in successive floors, in the shape of a conch shell, each one separated from  the other by a wide moat. Building a city like this was a brilliant idea, as its moats combined with the rivers and streams in the area provided easy transport to its residents. The king named it Loa Thanh, “the citadel in the form of a conch”.

By Lam Pham

By Lam Pham

With the citadel completed the turtle spirit returned to the water. As a reward to thank the king, the turtle deity gave An Duong one of his claws, and ordered him to build a crossbow with the claw as the trigger. Together with his military engineer, An Duong built a crossbow using this claw that magically multiplied its arrows by the thousands for every single arrow shot. This was An Duong’s secret weapon, and allowed him to repeatedly defeat all Qin attempts at taking his land, including those of Zhao Tuo. Loa Thanh is located on the site of the present day village of Co Loa. Soon after completing the citadel, his new city and empire prospered.

Zhao Tuo was at a loss as to how Thuc Phan was able to defeat him, and those before him, every time. Eventually he came up with a different strategy. He got his sun Trong Thuy to marry Thục Phan’s daughter, Princess My Chau. My Chau fell head over heels in love with her husband. Vietnamese custom dictated that the husband came to live in the residence of his wife’s family, which was in the Loa Thanh royal residence in this case. Zhao Tuo couldn’t hope for a better spying opportunity than this. It wasn’t long before he found out about the miraculous claw, and informed his farther. Zhao Tuo then told Trọng Thuy to steal the miraculous claw and crossbow and replace the current one with a fake.

With this new powerful weapon Zhao Tuo immediately launched his army against Au Lac. Noticing that his crossbow had lost its magical powers, the King Thuc grabbed Mỵ Chau and fled with her mounted behind him. However he couldn’t escape Zhao’s army, because My Chau, blinded by love dropped feathers from her dress for her husband to follow.

An Duong Vuong

By Lam Pham

Cornered in on one side by the sea and on the other by the Chinese army, Thuc Phan called on the Spirit of the Waters: “O, deity turtle, why have you forsaken me? Why did you betray me?” The golden turtle then appeared and replied: “I did not betray you. The traitor is sitting right behind you.” The king looked back, and realized, his daughter was the one who betrayed him! Without hesitation he drew his sword and cut hear head off, then jumped into the sea with the golden turtle.

Frantically looking for his beloved wife,  Trong Thuy soon discovered her decapitated body, with her blood flowing into the sea and saw that it changed into pearls. Overcome by guilt and grief, Trong Thuy returned to the citadel where he placed the pearls in the My Chau temple and holding her body in his arms, threw himself into the Jade Well. That’s why pearls become more radiant when washed in the well’s water.

In the citadel in Co Loa there’s a small sanctuary dedicated to the cult of the Princess, represented by a boulder which worshipers dressed up into a headless female deity.

After the fall of Loa Thanh, Zhao Tuo quickly conquered the rest of Au Lac, and added it as two prefectures, Jiao Zhi and Jiu Zhen, to his Nan Yue kingdom. The new Nan Yue spanned today’s provinces of Kwangtung and Kwangsi of China, northernmost Vietnam and the Red River Delta in north Vietnam. About 25 years after Zhao Tuo’s death in 137 BCE, the new ruling class of China, the Han, took over control of Nan Yue. From then on, for more than a thousand years, Vietnam was ruled by China. That was until 939 CE, when Vietnam regained its independence …

References

  1. A Story of Vietnam by Truong Buu Lam
  2. Ancient Vietnam: History and Archaeology by Anne-Valerie Schweyer
  3. Trieu dynasty
  4. Nguyen lords
  5. Au Lac
  6. An Dương Vương
Co Loa

Co Loa


Vietnam: A Journey Begins

My wife and I recently spent about 3 weeks in central Vietnam, and a few days in Singapore. As I’m absolutely hooked on history, our trip largely revolved around exploring the history of Singapore and Vietnam, and Vietnam’s in particular is vast and very colorful. Over a series of blog posts, I will be giving a personal account of the history of central Vietnam and a little bit of Singapore, that we explored during our recent holiday. As the first blog post in the series, I won’t discuss any history, rather just give a very quick overview of the things that most South Africans ask about, when we discuss our holiday in Vietnam.

From Singapore, we flew directly to Da Nang, where central Vietnam’s airport is located, then moved to Huế, and finished our holiday in Hoi An. Also keep in mind that my opinions are based on my experience in central Vietnam. The bigger cities in the far north, Hanoi and south, Ho Chi Minh, might be quite different, just like Cape Town is vastly different from Johannesburg.

Why We Chose Vietnam

It was an inspired, intuitive decision, based on the Vietnam Eyewitness Travel Guide . My only criteria for our overseas holiday, was that I’d like to visit any country with an ancient, rich and vibrant history. I think a further motivation was the exchange rate with the Rand and the fact that things are just cheaper in Vietnam (in comparison I realized South Africa isn’t such a cheap place), which made things a lot more affordable for us. I would say, on average, things are about 50% cheaper in Vietnam than in South Africa. That goes for everything from hotels to buying things at a street market. I envy how cheap a holiday in Vietnam must be for the Europeans and British.

By the way, about the Eyewitness book. It’s a wonderful little book to get inspired about the country, but don’t depend on it to get around Vietnam day-to-day. Your Swiss army knife of info, to survive in Vietnam will be the Lonely Planet’s guide on Vietnam. That book was essential to ensuring an enjoyable stay in Vietnam.

The American War in Vietnam

The first thing most people asked, is if they have yet fully recovered from the war against America. The answer to that is an unequivocal, Yes! There are absolutely no signs in any of the cities, that there has ever been a war like that in Vietnam. And I would hope so, the American war in Vietnam ended almost 40 years ago. At historic buildings and sites some signs of the war are still visible. This is hardly surprising, since these buildings are historically significant and a heritage, therefore major restorations are not really possible or allowed.

When South Africans ask me this question, I realize just how little we know about Vietnam (and the same is true of them about Africa), and that the only, outdated, knowledge South Africans have of this amazing country and people, is that which they got from western news back in the 1970s and American war movies.

Socio Economics

In short there are few rich people in Vietnam. But, there are very few people that are desperately poor. Unlike South Africa, where there is a small group of people earning a decent living, and then a massive number of people struggling to make ends meet. Something that really got my attention, was the fact that there are no informal settlements in central Vietnam. Almost everyone has a pretty little house to live in, and many even have a small holding, that they can cultivate. There are also none of those characterless, mass cloned, little matchbox houses, that the South African department of housing builds. Each little home has it’s own style. The main buildings all have the same narrow, rectangular structure, but each building has been given its own unique style by its owner. Everyone wants to sell you something, but you won’t find any beggars at the street corners.

Crime

As anyone that has spent some time with South Africans would know, we are always obsessing about crime. I’m therefore pleased to announce that Vietnam is a very safe place indeed. Safer than South Africa. We’ve heard of people’s wallets being pinched, and someone might try to scam you in a transaction at the market, but there are no armed robberies, where peoples’ expensive valuables are stolen at gun point or knife’s edge. For example, you can walk around in the street, late at night, taking pictures with your expensive camera, without fear of being robbed.

The People

The Vietnamese people seem to be a happy bunch, that’s content with life. Everyone was extremely friendly, and helpful (especially if they have something to sell you). Compared to the Singaporeans, I found the Vietnamese to let more of their emotions show. Warm, hearty laughs and smiles, frowns and even arguments in public were more frequent. Whereas the Singaporeans kept an efficient straight face most of the time. In Da Nang we even saw an older lady (I’m guessing the mother) have a massive argument with a younger lady (I’m guessing her daughter), where she later took off her sandals and started hitting the younger woman.

I got a strong sense that the average Vietnamese really doesn’t know a lot about the world outside their country’s border. From the confused expression on their faces when we answered that we’re from South Africa, it was obvious that most Vietnamese would struggle to find South Africa on a map. Most of them thought we were German (but I don’t blame them for this, I would draw the same conclusion listening to Afrikaners talking), and then some went on to tell us, after realizing that there is “Africa” in our country’s name, that we can’t be from South Africa because we are, you guessed it, white!

Twice Vietnamese were so amused to see some westerners, that they started taking photos and videos of us, right in our faces. Now that was a strange, and slightly awkward, experience.

Language

No surprises here: Vietnamese speak and write Vietnamese. However, I was expecting the English conversations to be a much bigger problem, but it turned out that most people’s English is good enough to get the job done. English of younger people from cities are actually good enough to allow a decent conversation.

You Can Also Have A Resort Holiday In Vietnam

As I’ve already mentioned, I’m completely addicted to history. So our holiday was specifically targeted at exploring, experiencing and learning about Vietnam’s history, mainly until about the 1920s (i.e. we didn’t really pay attention to the anti colonial revolution against France, and the American war in Vietnam). We visited as many historical places as we could, and often had to walk or cycle long distances in +35°C temperatures. This isn’t very comfortable, and sometimes even a little stressful to find your way, by yourself, in an unknown place. We also stayed in the heart of each city’s centre, which isn’t always the sexiest location, but it’s closest to the action.

However, if you prefer to have more of a resort type holiday, where you relax all the time and enjoy long walks on perfect white sandy beaches, then Vietnam can offer you that as well. There are a large number of modern, luxurious beach resorts to choose from, on the beach from Da Nang to Hoi An (called China Beach). So if you’re thinking of spending a holiday at a Thailand resort, maybe also check out its equivalent in Vietnam. I can highly recommend the Hoi An beachfront for those looking for a hassle free, chill holiday. Hoi An is an old town, that has been beautifully maintained and restored. So if you stay at the Hoi An beachfront, then you will get the best of both worlds – the beach resort and classic town lifestyle. Personally, I found Hoi An to be a little boring, and too much tourist focused. For example, in Hoi An’s old town, there are literally more tourists, than Vietnamese.

What An Absolutely Amazing Country

We absolutely loved Vietnam. It was one of the most profound experiences of my life. The vibrant history, people, temples, pagodas, tombs and natural beauty was unforgettable. During a three week stay we hardly scratched the surface of what Vietnam has to offer. We will definitely return in a few years (permitting finances allow it), probably to Hanoi, as that is the heart of Vietnam’s northern history.


Follow

Get every new post delivered to your Inbox.